func ListenToDiscord(config *eqemuconfig.Config, disco *discord.Discord) (err error) { var session *discordgo.Session var guild *discordgo.Guild //log.Println("Listen to discord..") if session, err = disco.GetSession(); err != nil { log.Printf("[Discord] Failed to get instance %s: %s (Make sure bot is part of server)", config.Discord.ServerID, err.Error()) return } if guild, err = session.Guild(config.Discord.ServerID); err != nil { log.Printf("[Discord] Failed to get server %s: %s (Make sure bot is part of server)", config.Discord.ServerID, err.Error()) return } isNotAvail := true if guild.Unavailable == &isNotAvail { log.Printf("[Discord] Failed to get server %s: Server unavailable (Make sure bot is part of server, and has permission)", config.Discord.ServerID, err.Error()) return } session.StateEnabled = true session.AddHandler(messageCreate) log.Printf("[Discord] Connected\n") if err = session.Open(); err != nil { log.Printf("[Discord] Session closed: %s", err.Error()) return } select {} return }
func main() { var err error // Check for Username and Password CLI arguments. if len(os.Args) != 3 { fmt.Println("You must provide username and password as arguments. See below example.") fmt.Println(os.Args[0], " [username] [password]") return } // Create a new Discord Session interface and set a handler for the // OnMessageCreate event that happens for every new message on any channel dg := discordgo.Session{} // Register messageCreate as a callback for the messageCreate events. dg.AddHandler(messageCreate) // Login to the Discord server and store the authentication token err = dg.Login(os.Args[1], os.Args[2]) if err != nil { fmt.Println(err) return } // Open websocket connection err = dg.Open() if err != nil { fmt.Println(err) } // Simple way to keep program running until any key press. var input string fmt.Scanln(&input) return }
func setupHandlers(session *discordgo.Session) { logInfo("Setting up event handlers...") session.AddHandler(func(sess *discordgo.Session, evt *discordgo.MessageCreate) { message := evt.Message switch strings.ToLower(strings.TrimSpace(message.Content)) { case "!uptime": hostname, err := os.Hostname() panicOnErr(err) duration := time.Now().Sub(startTime) sendMessage(sess, fmt.Sprintf( "Uptime is: **%02d:%02d:%02d** (since **%s**) on **%s**", int(duration.Hours()), int(duration.Minutes())%60, int(duration.Seconds())%60, startTime.Format(time.Stamp), hostname)) } }) session.AddHandler(func(sess *discordgo.Session, evt *discordgo.PresenceUpdate) { logDebug("PRESENSE UPDATE fired for user-ID:", evt.User.ID) self := fetchUser(sess, "@me") u := fetchUser(sess, evt.User.ID) // Ignore self if u.ID == self.ID || u.Bot { return } // Handle online/offline notifications if evt.Status == "offline" { if _, ok := usersOnline[u.ID]; ok { delete(usersOnline, u.ID) sendMessage(sess, fmt.Sprintf(`**%s** went offline`, u.Username)) } } else { if _, ok := usersOnline[u.ID]; !ok { usersOnline[u.ID] = struct{}{} sendMessage(sess, fmt.Sprintf(`**%s** is now online`, u.Username)) } } }) session.AddHandler(func(sess *discordgo.Session, evt *discordgo.GuildCreate) { logInfo("GUILD_CREATE event fired") for _, presence := range evt.Presences { user := presence.User logInfo("Marked user-ID online:", user.ID) usersOnline[user.ID] = struct{}{} } }) }