From a5336e53dad8f7be3f6b4cf59b8d2e311a1d4450 Mon Sep 17 00:00:00 2001 From: Bruce Marriner Date: Mon, 16 Nov 2015 14:08:29 -0600 Subject: [PATCH] Inital add of example bot --- bot/admin.go | 92 +++++++++++++++++++++++++++++++++++++ bot/dgbot.go | 61 +++++++++++++++++++++++++ bot/events.go | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 275 insertions(+) create mode 100644 bot/admin.go create mode 100644 bot/dgbot.go create mode 100644 bot/events.go diff --git a/bot/admin.go b/bot/admin.go new file mode 100644 index 0000000..afe7a01 --- /dev/null +++ b/bot/admin.go @@ -0,0 +1,92 @@ +package main + +import ( + "fmt" + "strings" +) + +// +func admin(line string) (response string) { + + var err error + + // trim any leading or trailing space off the whole line + line = strings.TrimSpace(line) + + // split the command from the rest + split := strings.SplitN(line, " ", 2) + + // store the command and payload seperately + command := strings.ToLower(split[0]) + command = strings.TrimPrefix(command, "~") + + var payload string = "" + if len(split) > 1 { + payload = split[1] + } + + if command == "help" { + response += fmt.Sprintln("`~help ...............` Display this help text") + response += fmt.Sprintln("`~username [string]...` Set login username to [string]") + response += fmt.Sprintln("`~password [string]...` Set login password to [string]") + response += fmt.Sprintln("`~login ..............` Login to Discord") + response += fmt.Sprintln("`~listen .............` Start websocket listener") + response += fmt.Sprintln("`~logout .............` Logout from Discord") + return + } + + if command == "username" { + Username = payload + response += "Done." + return + } + + if command == "password" { + Password = payload + response += "Done." + return + } + + if command == "login" { + Session.Token, err = Session.Login(Username, Password) + if err != nil { + fmt.Println("Unable to login to Discord.") + fmt.Println(err) + } + response += "Done." + return + } + + if command == "listen" { + + // open connection + err = Session.Open() + if err != nil { + fmt.Println(err) + } + + // Do Handshake? (dumb name) + err = Session.Handshake() + if err != nil { + fmt.Println(err) + } + + // Now listen for events / messages + go Session.Listen() + response += "Done." + return + } + + if command == "logout" { + err = Session.Logout() + if err != nil { + fmt.Println("Unable to logout from Discord.") + fmt.Println(err) + } + response += "Done." + return + } + + response += "I'm sorry I don't understand that command. Try ~help" + return +} diff --git a/bot/dgbot.go b/bot/dgbot.go new file mode 100644 index 0000000..1e422cb --- /dev/null +++ b/bot/dgbot.go @@ -0,0 +1,61 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "math/rand" + "os" + "time" + + Discord "github.com/bwmarrin/discordgo" +) + +// Global Variables +var ( + Session Discord.Session + Username string + Password string +) + +func main() { + fmt.Printf("\nDiscordgo Bot Starting.\n\n") + + // Register all the Event Handlers + RegisterHandlers() + + // read in the config file. + ParseFile() + + // seed the random number generator + rand.Seed(time.Now().UTC().UnixNano()) + + // main program loop to keep dgbot running + // will add stuff here to track goroutines + // and monitor for CTRL-C or other things. + for { + time.Sleep(1000 * time.Millisecond) + } + + fmt.Println("\nDiscordgo Bot shutting down.\n") +} + +// ParseFile will read a file .dgbotrc and run all included +// commands +func ParseFile() { + file, err := os.Open(".dgbotrc") + if err != nil { + return + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + fmt.Println(scanner.Text()) + fmt.Println(admin(scanner.Text())) + } + + if err := scanner.Err(); err != nil { + log.Fatal(err) + } +} diff --git a/bot/events.go b/bot/events.go new file mode 100644 index 0000000..51e4140 --- /dev/null +++ b/bot/events.go @@ -0,0 +1,122 @@ +package main + +import ( + Discord "github.com/bwmarrin/discordgo" +) + +// Registers all event handlers +func RegisterHandlers() { + + Session = Discord.Session{ + OnEvent: OnEvent, + OnReady: OnReady, + OnTypingStart: OnTypingStart, + OnMessageCreate: OnMessageCreate, + OnMessageUpdate: OnMessageUpdate, + OnMessageDelete: OnMessageDelete, + OnMessageAck: OnMessageAck, + OnVoiceStateUpdate: OnVoiceStateUpdate, + OnPresenceUpdate: OnPresenceUpdate, + OnChannelCreate: OnChannelCreate, + OnChannelUpdate: OnChannelUpdate, + OnGuildCreate: OnGuildCreate, + OnGuildUpdate: OnGuildUpdate, + OnGuildDelete: OnGuildDelete, + OnGuildRoleCreate: OnGuildRoleCreate, + OnGuildRoleUpdate: OnGuildRoleUpdate, + OnGuildRoleDelete: OnGuildRoleDelete, + OnGuildMemberAdd: OnGuildMemberAdd, + OnGuildMemberUpdate: OnGuildMemberUpdate, + OnGuildMemberRemove: OnGuildMemberRemove, + OnGuildIntegrationsUpdate: OnGuildIntegrationsUpdate, + } + +} + +// OnEvent is called for unknown events or unhandled events. It provides +// a generic interface to handle them. +func OnEvent(s *Discord.Session, e Discord.Event) { + // Add code here to handle this event. +} + +// OnReady is called when Discordgo receives a READY event +// This event must be handled and must contain the Heartbeat call. +func OnReady(s *Discord.Session, st Discord.Ready) { + + // start the Heartbeat + go s.Heartbeat(st.HeartbeatInterval) + + // Add code here to handle this event. +} + +func OnTypingStart(s *Discord.Session, st Discord.TypingStart) { + // Add code here to handle this event. +} + +func OnPresenceUpdate(s *Discord.Session, st Discord.PresenceUpdate) { + // Add code here to handle this event. +} + +func OnMessageCreate(s *Discord.Session, m Discord.Message) { + // Add code here to handle this event. +} + +func OnMessageUpdate(s *Discord.Session, m Discord.Message) { + // Add code here to handle this event. +} + +func OnMessageAck(s *Discord.Session, st Discord.MessageAck) { + // Add code here to handle this event. +} + +func OnMessageDelete(s *Discord.Session, st Discord.MessageDelete) { + // Add code here to handle this event. +} + +func OnVoiceStateUpdate(s *Discord.Session, st Discord.VoiceState) { + // Add code here to handle this event. +} + +func OnChannelCreate(s *Discord.Session, st Discord.Channel) { + // Add code here to handle this event. +} + +func OnChannelUpdate(s *Discord.Session, st Discord.Channel) { + // Add code here to handle this event. +} + +func OnGuildCreate(s *Discord.Session, st Discord.Guild) { + // Add code here to handle this event. +} + +func OnGuildUpdate(s *Discord.Session, st Discord.Guild) { + // Add code here to handle this event. +} +func OnGuildDelete(s *Discord.Session, st Discord.Guild) { + // Add code here to handle this event. +} + +func OnGuildRoleCreate(s *Discord.Session, st Discord.GuildRole) { + // Add code here to handle this event. +} +func OnGuildRoleUpdate(s *Discord.Session, st Discord.GuildRole) { + // Add code here to handle this event. +} +func OnGuildRoleDelete(s *Discord.Session, st Discord.GuildRoleDelete) { + // Add code here to handle this event. +} +func OnGuildMemberAdd(s *Discord.Session, st Discord.Member) { + // Add code here to handle this event. +} + +func OnGuildMemberUpdate(s *Discord.Session, st Discord.Member) { + // Add code here to handle this event. +} + +func OnGuildMemberRemove(s *Discord.Session, st Discord.Member) { + // Add code here to handle this event. +} + +func OnGuildIntegrationsUpdate(s *Discord.Session, st Discord.GuildIntegrationsUpdate) { + // Add code here to handle this event. +}