|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/bogosj/tesla"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/rudi9719/loggy"
|
|
|
|
"golang.org/x/oauth2"
|
|
|
|
"samhofi.us/x/keybase/v2"
|
|
|
|
"samhofi.us/x/keybase/v2/types/chat1"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
k = keybase.NewKeybase()
|
|
|
|
log = loggy.NewLogger(loggy.LogOpts{
|
|
|
|
OutFile: "teslabot.log",
|
|
|
|
KBTeam: "nightmarehaus.logs",
|
|
|
|
KBChann: "teslabot",
|
|
|
|
Level: 5,
|
|
|
|
ProgName: "TeslaBot",
|
|
|
|
UseStdout: true,
|
|
|
|
})
|
|
|
|
commands []BotCommand
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
chat := handleChat
|
|
|
|
handlers := keybase.Handlers{
|
|
|
|
ChatHandler: &chat,
|
|
|
|
}
|
|
|
|
setupCommands()
|
|
|
|
var adCmds []chat1.UserBotCommandInput
|
|
|
|
for _, v := range commands {
|
|
|
|
adCmds = append(adCmds, v.Advert.Commands...)
|
|
|
|
}
|
|
|
|
ads := chat1.AdvertiseCommandAPIParam{
|
|
|
|
Typ: "public",
|
|
|
|
Commands: adCmds,
|
|
|
|
}
|
|
|
|
|
|
|
|
cmds := keybase.AdvertiseCommandsOptions{
|
|
|
|
Alias: "Tesla Bot",
|
|
|
|
Advertisements: []chat1.AdvertiseCommandAPIParam{ads},
|
|
|
|
}
|
|
|
|
|
|
|
|
k.AdvertiseCommands(cmds)
|
|
|
|
k.Run(handlers, &keybase.RunOptions{})
|
|
|
|
}
|
|
|
|
|
|
|
|
func handleChat(m chat1.MsgSummary) {
|
|
|
|
defer log.PanicSafe()
|
|
|
|
if m.Content.TypeName != "text" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
parts := strings.Split(m.Content.Text.Body, " ")
|
|
|
|
command := strings.Replace(parts[0], "!", "", -1)
|
|
|
|
for _, v := range commands {
|
|
|
|
for _, test := range v.Triggers {
|
|
|
|
if command == test {
|
|
|
|
go v.Exec(m)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func isAuthenticated(m chat1.MsgSummary) bool {
|
|
|
|
test, _ := k.KVGet(&m.Channel.Name, "teslabot", "authtok")
|
|
|
|
return test.EntryValue != ""
|
|
|
|
}
|
|
|
|
|
|
|
|
func getTeslaClient(m chat1.MsgSummary) *tesla.Client {
|
|
|
|
var t *oauth2.Token
|
|
|
|
if !isAuthenticated(m) {
|
|
|
|
k.SendMessageByConvID(m.ConvID, "You are not authenticated.")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
test, _ := k.KVGet(&m.Channel.Name, "teslabot", "authtok")
|
|
|
|
err := json.Unmarshal([]byte(test.EntryValue), &t)
|
|
|
|
if err != nil {
|
|
|
|
tracker := uuid.NewString()
|
|
|
|
k.SendMessageByConvID(m.ConvID, "There was an retrieving token from KVStore. Contact @rudi9719 for more information with code %+v", tracker)
|
|
|
|
log.LogError("%+v: %+v", tracker, err)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
c, err := tesla.NewClient(context.Background(), tesla.WithToken(t))
|
|
|
|
if err != nil {
|
|
|
|
tracker := uuid.NewString()
|
|
|
|
k.SendMessageByConvID(m.ConvID, "There was an error logging in. Contact @rudi9719 for more information with code %+v", tracker)
|
|
|
|
log.LogError("%+v: %+v", tracker, err)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return c
|
|
|
|
}
|
|
|
|
|
|
|
|
func getVehicle(m chat1.MsgSummary) *tesla.Vehicle {
|
|
|
|
c := getTeslaClient(m)
|
|
|
|
if c == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
parts := strings.Split(m.Content.Text.Body, " ")
|
|
|
|
vehicles, err := c.Vehicles()
|
|
|
|
if err != nil {
|
|
|
|
tracker := uuid.NewString()
|
|
|
|
k.SendMessageByConvID(m.ConvID, "There was an error listing vehicles. Contact @rudi9719 for more information with code %+v", tracker)
|
|
|
|
log.LogError("%+v: %+v", tracker, err)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
v := vehicles[0]
|
|
|
|
if len(parts) == 2 {
|
|
|
|
for _, test := range vehicles {
|
|
|
|
if parts[1] == test.Vin {
|
|
|
|
v = test
|
|
|
|
}
|
|
|
|
if parts[1] == test.DisplayName {
|
|
|
|
v = test
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return v
|
|
|
|
}
|