-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiscord.go
157 lines (133 loc) · 4.28 KB
/
discord.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package main
import (
"fmt"; "log"
"github.com/bwmarrin/discordgo"
"strings"
"regexp"
)
var DBot *discordgo.Session
var DEmoji []*discordgo.Emoji
var DEmojiRegex *regexp.Regexp
// Formats message for IRC
func DMessageForIRC(m *discordgo.Message) string {
msg := m.ContentWithMentionsReplaced()
// add embeds
for _, e := range m.Embeds {
msg = fmt.Sprintf("%s %s", msg, e.URL)
}
// add attachments
for _, e := range m.Attachments {
msg = fmt.Sprintf("%s %s", msg, e.URL)
}
// Fix emoji
msg = DEmojiRegex.ReplaceAllString(msg, "$1")
// IRC doesn't like multiline
msg = strings.Replace(msg,"\n", " ",-1)
return msg
}
func DGetNick(u *discordgo.User) string {
member, err := DBot.GuildMember(Config.GuildID, u.ID)
if err == nil && member.Nick != "" {
return member.Nick
} else {
return u.Username
}
}
func DGetNickByID(ID string) string {
u, err := DBot.User(ID)
if err == nil {
return DGetNick(u)
}
return "usuário desconhecido"
}
func DChannelName(ID string) string {
channel, err := DBot.Channel(ID)
if err == nil {
return channel.Name
}
return "canal desconhecido"
}
func DOnMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
// Ignore messages from ourselves
for _, wh := range Config.Hooks { if wh.ID == m.WebhookID { return } }
// Holds nick/user from poster, as well as who he replies to
OriginString := DGetNick(m.Author)
// Cache UID and avatar for mentions and webhook
aurl := m.Author.AvatarURL("")
log.Printf("Caching data for user %s: ID %s, URL: %s\n", OriginString, m.Author.ID, aurl)
DNameToID[OriginString] = DCachedUserData{
ID: m.Author.ID,
AvatarURL: aurl,
}
// Handle replying
if m.MessageReference != nil {
ReplyTo, err := DBot.ChannelMessage(m.MessageReference.ChannelID, m.MessageReference.MessageID)
if err == nil {
OriginString = fmt.Sprintf("%s em reposta a %s \"%-10s\"...", OriginString, DGetNick(ReplyTo.Author), DMessageForIRC(ReplyTo))
}
}
// Try to get channel name
msg := DMessageForIRC(m.Message)
IBot.Cmd.Messagef(Config.IRCChannel, "%s no %s: %s", OriginString, DChannelName(m.ChannelID), msg)
log.Printf("[DBot] Relayed message \"%s\" (from %s) to IRC", msg, m.Author.Username)
}
func DIRCMessage(Iu string, Im string) {
// Select channel
id := Config.DefaultHook
if IUserDChannels[Iu] != "" {
id = IUserDChannels[Iu]
}
Im = IMentionRegex.ReplaceAllStringFunc(Im, IReplMention)
Im = IEmojiRegex.ReplaceAllStringFunc(Im, IReplEmoji)
params := discordgo.WebhookParams{
Username: Iu,
Content: Im,
AvatarURL: DNameToID[Iu].AvatarURL,
}
_, err := DBot.WebhookExecute(Config.Hooks[id].ID, Config.Hooks[id].Token, false, ¶ms)
if err == nil {
log.Printf("[DBot] Relayed message \"%s\" (from %s) to Discord", Im, Iu)
} else {
log.Printf("[DBot] Failed to relay \"%s\" to Discord (%s)", Im, err)
}
}
func DOnGuildEmojisUpdate(s *discordgo.Session, e *discordgo.GuildEmojisUpdate) { DEmoji = e.Emojis }
func DRelayReaction(e discordgo.MessageReaction, verb string) {
var err error
m, err := DBot.ChannelMessage(e.ChannelID, e.MessageID)
if err != nil {
log.Printf("Can't log reaction: %s\n", err)
return
}
uname := DGetNick(m.Author)
IBot.Cmd.Messagef(Config.IRCChannel,"%s %s :%s: a \"%-10s\"... de %s no %s",
DGetNickByID(e.UserID),
verb,
e.Emoji.Name,
DMessageForIRC(m),
uname,
DChannelName(e.ChannelID),
)
log.Printf("[DBot] Relayed reaction %s (verb: %s) from %s to IRC", e.Emoji.Name, verb, uname)
}
func DInit() {
var err error
// Regexps
DEmojiRegex = regexp.MustCompile("<a?(:[[:alnum:]_]+:)[[:alnum:]]+>")
DBot, err = discordgo.New("Bot " + Config.Token)
if err != nil {
panic("Failed to create a discord session.")
}
DBot.AddHandler(DOnMessageCreate)
DBot.AddHandler(DOnGuildEmojisUpdate)
DBot.AddHandler(func (s *discordgo.Session, e *discordgo.MessageReactionAdd) { DRelayReaction(*e.MessageReaction, "reagiu com") })
DBot.AddHandler(func (s *discordgo.Session, e *discordgo.MessageReactionRemove) { DRelayReaction(*e.MessageReaction, "retirou a reação com") })
DBot.Identify.Intents = discordgo.IntentsGuildMessages | discordgo.IntentsGuildEmojis | discordgo.IntentsGuildMessageReactions
if DBot.Open() != nil {
panic("Can't open a socket with Discord")
}
DEmoji, err = DBot.GuildEmojis(Config.GuildID)
if err != nil {
fmt.Println("Failed to get emoji.")
}
}