--- a/.hgignore Wed Mar 20 21:07:22 2019 +0000
+++ b/.hgignore Wed Mar 20 14:46:13 2019 -0700
@@ -28,4 +28,5 @@
\ No newline at end of file
\ No newline at end of file
--- a/main.go Wed Mar 20 21:07:22 2019 +0000
+++ b/main.go Wed Mar 20 14:46:13 2019 -0700
@@ -1,10 +1,9 @@
@@ -15,16 +14,18 @@
"github.com/bwmarrin/discordgo"
"github.com/nicklaw5/helix"
+ "github.com/prologic/bitcask" TwitchClient *helix.Client
- guildToChannel map[string]string
+ database *bitcask.Bitcask @@ -32,7 +33,8 @@
flag.StringVar(&DiscordToken, "t", "", "Discord Bot Token")
- flag.StringVar(&TwitchToken, "tcid", "", "Twitch Client ID ID")
+ flag.StringVar(&TwitchToken, "tcid", "", "Twitch Client ID") + flag.StringVar(&DatabasePath, "db", "./db", "Database Path") @@ -65,12 +67,8 @@
logDebug("Discord Token:", DiscordToken)
logDebug("Twitch Token:", TwitchToken)
- if fileExist("guilds.json") {
- plan, _ := ioutil.ReadFile("guilds.json")
- json.Unmarshal(plan, &guildToChannel)
- guildToChannel = make(map[string]string)
+ database, _ = bitcask.Open(DatabasePath) client, err := helix.NewClient(&helix.Options{
@@ -101,9 +99,6 @@
- data, _ := json.Marshal(guildToChannel)
- ioutil.WriteFile("guilds.json", data, 0644)
func presenceUpdate(sess *discordgo.Session, evt *discordgo.PresenceUpdate) {
@@ -115,8 +110,13 @@
if evt.Game.Type == discordgo.GameTypeStreaming {
pURL, _ := url.Parse(evt.Game.URL)
- if ch, ok := guildToChannel[evt.GuildID]; ok {
- processPresenceUpdate(sess, ch, strings.TrimLeft(pURL.Path, "/"))
+ channel := getguild2channel(evt.GuildID) + err := processPresenceUpdate(sess, channel, strings.TrimLeft(pURL.Path, "/")) @@ -131,8 +131,12 @@
if strings.EqualFold(commandItems[0], "!uptime") {
duration := time.Now().Sub(startTime)
- if ch, ok := guildToChannel[m.GuildID]; ok {
- err := sendMessage(s, ch, fmt.Sprintf(
+ channel := getguild2channel(m.GuildID) + if channel != m.ChannelID { + err := sendMessage(s, channel, fmt.Sprintf( "Uptime is: **%02d:%02d:%02d** (since **%s**)",
int(duration.Minutes())%60,
@@ -148,15 +152,24 @@
- if ch, ok := guildToChannel[m.GuildID]; ok {
- processPresenceUpdate(s, ch, commandItems[1])
+ channel := getguild2channel(m.GuildID) + if channel != m.ChannelID { + err := processPresenceUpdate(s, channel, commandItems[1]) if strings.EqualFold(commandItems[0], "!init") {
sendMessage(s, m.ChannelID, "All set up to talk in this channel!")
- guildToChannel[m.GuildID] = m.ChannelID
+ setguild2channel(m.GuildID, m.ChannelID) @@ -166,14 +179,13 @@
-func processPresenceUpdate(s *discordgo.Session, channelid, twitchName string) {
+func processPresenceUpdate(s *discordgo.Session, channelid, twitchName string) error { resp, err := TwitchClient.GetUsers(&helix.UsersParams{
Logins: []string{twitchName},
@@ -183,6 +195,10 @@
+ if len(resp.Data.Users) <= 0 { + return errors.New("user was not found") user := resp.Data.Users[0]
f := make([]*discordgo.MessageEmbedField, 0)
@@ -191,7 +207,7 @@
- s.ChannelMessageSendEmbed(channelid, &discordgo.MessageEmbed{
+ _, err = s.ChannelMessageSendEmbed(channelid, &discordgo.MessageEmbed{ Image: &discordgo.MessageEmbedImage{
URL: user.OfflineImageURL,
@@ -204,6 +220,8 @@
func fileExist(name string) bool {
@@ -214,3 +232,17 @@
+func getguild2channel(guild string) string { + data, err := database.Get(guild) +func setguild2channel(guild, channel string) { + database.Put(guild, []byte(channel))