commit c9d44958e747b79ef92258755d87b50a99158d8c Author: Gregory Rudolph Date: Thu Jan 16 08:26:01 2020 -0500 First commit diff --git a/keyrcbot.go b/keyrcbot.go new file mode 100755 index 0000000..4acf8f6 --- /dev/null +++ b/keyrcbot.go @@ -0,0 +1,149 @@ +package main + +import ( + "flag" + "fmt" + "os" + "strings" + + "github.com/rudi9719/loggy" + "github.com/whyrusleeping/hellabot" + "samhofi.us/x/keybase" +) + +var ( + dev = false + k = keybase.NewKeybase() + channel keybase.Channel + irc *hbot.Bot + linkName = "halium" + botNick = "keyrcbot" + serv = flag.String("server", "chat.freenode.net:6667", "hostname and port") + nick = flag.String("nick", botNick, "nickname for the bot") + logOpts = loggy.LogOpts{ + OutFile: "irc.log", + KBTeam: "nightmarehaus.bots", + KBChann: "general", + ProgName: "irclink", + Level: 3, + UseStdout: true, + } + log = loggy.NewLogger(logOpts) +) + +func main() { + log.LogWarn("Starting bot") + if !k.LoggedIn { + log.LogPanic("You are not logged in.") + } + channel.MembersType = keybase.TEAM + channel.Name = "keyrc" + channel.TopicName = "general" + sendChat("Link starting", "general") + go setupIRC() + k.Run(func(api keybase.ChatAPI) { + handleMessage(api) + }) +} + +func setupIRC() { + var err error + saslOption := func(bot *hbot.Bot) { + bot.SASL = true + bot.Password = os.Getenv("IRC_PASS") // TODO: Set this + } + hijackSession := func(bot *hbot.Bot) { + bot.HijackSession = true + log.LogWarn("setting irc hijackSession") + } + irc, err = hbot.NewBot(*serv, *nick, saslOption, hijackSession) + if err != nil { + log.LogPanic("Failed to start IRC component") + } + setupKeybaseLinks() + log.LogWarn("Calling irc.Run()") + irc.Run() + log.LogError("irc.Run() returned") +} +func setupKeybaseLinks() { + log.LogWarn("Setting up keybase channel links") + api, err := k.ChatList() + if err != nil { + log.LogError(fmt.Sprintf("Err was not nil from ChatList() in setupKeybaseLinks(), ```%+v```", err)) + } + for _, s := range api.Result.Conversations { + if s.Channel.MembersType == keybase.TEAM && s.Channel.Name == channel.Name && s.Channel.TopicName != "general" { + addIrcTrigger(s.Channel.TopicName) + } + } +} +func addIrcTrigger(name string) { + name = strings.Replace(name, "#", "", -1) + log.LogWarn(fmt.Sprintf("Setting up trigger for #%s", name)) + var botLessTrigger = hbot.Trigger{ + func(b *hbot.Bot, m *hbot.Message) bool { + log.LogInfo(fmt.Sprintf("i[%s]: %s", m.From, m.Content)) + return m.From != botNick + }, + func(b *hbot.Bot, m *hbot.Message) bool { + if m.To == fmt.Sprintf("#%s", name) { + if m.Content == "" { + return false + } + sendChat(fmt.Sprintf("[%s]: %s", m.From, m.Content), name) + log.LogDebug("Calling sendChat") + } + return false + }, + } + irc.Channels = append(irc.Channels, fmt.Sprintf("#%s", name)) + irc.Join(fmt.Sprintf("#%s", name)) + log.LogWarn(fmt.Sprintf("Adding trigger for #%s to bot", name)) + irc.AddTrigger(botLessTrigger) + log.LogDebug(fmt.Sprintf("irc.Channels = %+v", irc.Channels)) + sendChat(fmt.Sprintf("# Connected to #%s!", name), name) + +} +func handleMessage(api keybase.ChatAPI) { + if api.Msg.Channel.Name != channel.Name { + return + } + if api.Msg.Sender.Username == k.Username { + return + } + + if api.Msg.Content.Type != "text" { + return + } + msgSender := api.Msg.Sender.Username + msgBody := api.Msg.Content.Text.Body + log.LogInfo(fmt.Sprintf("k[%s]: %s", msgSender, msgBody)) + + parts := strings.Split(msgBody, " ") + if parts[0] == "#" { + return + } + if len(parts) == 3 { + if parts[0] == fmt.Sprintf("@%s", k.Username) { + if parts[1] == "join" { + if api.Msg.Channel.TopicName == "general" && parts[2] != "general" { + addIrcTrigger(parts[2]) + return + } + } + } + } + if api.Msg.Channel.TopicName == "general" { + return + } + irc.Msg(fmt.Sprintf("#%s", api.Msg.Channel.TopicName), fmt.Sprintf("[%s]: %s", msgSender, msgBody)) +} + +func sendChat(message string, chann string) { + channel.TopicName = chann + chat := k.NewChat(channel) + _, err := chat.Send(message) + if err != nil { + log.LogError(fmt.Sprintf("There was an error %+v", err)) + } +}