First commit
This commit is contained in:
149
keyrcbot.go
Executable file
149
keyrcbot.go
Executable file
@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user