Skip to content

Commit 4957bcd

Browse files
committed
Merging in Nick Change Formatting.
1 parent f770748 commit 4957bcd

File tree

2 files changed

+57
-3
lines changed

2 files changed

+57
-3
lines changed

bridge/irc_listener.go

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ type ircListener struct {
1313
bridge *Bridge
1414

1515
joinQuitCallbacks map[string]int
16+
relayNickTrackID int
1617
}
1718

1819
func newIRCListener(dib *Bridge, webIRCPass string) *ircListener {
1920
irccon := irc.IRC(dib.Config.IRCListenerName, "discord")
20-
listener := &ircListener{irccon, dib, nil}
21+
listener := &ircListener{irccon, dib, nil, 0}
2122

2223
dib.SetupIRCConnection(irccon, "discord.", "fd75:f5f5:226f::")
2324
listener.SetDebugMode(dib.Config.Debug)
@@ -39,6 +40,8 @@ func newIRCListener(dib *Bridge, webIRCPass string) *ircListener {
3940
listener.JoinChannels()
4041
})
4142

43+
listener.AddCallback("NICK", listener.nickTrackNick)
44+
4245
// Note that this might override SetupNickTrack!
4346
listener.OnJoinQuitSettingChange()
4447

@@ -66,6 +69,51 @@ func (i *ircListener) nickTrackNick(event *irc.Event) {
6669
}
6770
}
6871

72+
func userOnChannelFix(user string, channel irc.Channel) bool {
73+
if _, ok := channel.Users[user]; ok {
74+
return true
75+
}
76+
77+
// work around nicks being prefixed with mode characters for some reason
78+
for _, c := range "!$~&@%+" {
79+
if _, ok := channel.Users[string(c)+user]; ok {
80+
return true
81+
}
82+
}
83+
84+
return false
85+
}
86+
87+
func (i *ircListener) OnNickRelayToDiscord(event *irc.Event) {
88+
newNick := event.Message()
89+
message := i.bridge.ircManager.formatDiscordMessage(event.Code, event, newNick, "")
90+
91+
// if the message is empty...
92+
if message == "" {
93+
return // do nothing, Discord doesn't like empty messages anyway
94+
}
95+
96+
msg := IRCMessage{
97+
Username: "",
98+
Message: message,
99+
}
100+
101+
for _, m := range i.bridge.mappings {
102+
channel := m.IRCChannel
103+
channelObj, ok := i.Connection.Channels[channel]
104+
if !ok {
105+
continue
106+
}
107+
108+
if !userOnChannelFix(newNick, channelObj) {
109+
continue
110+
}
111+
112+
msg.IRCChannel = channel
113+
i.bridge.discordMessagesChan <- msg
114+
}
115+
}
116+
69117
// From irc_nicktrack.go.
70118
func (i *ircListener) nickTrackQuit(e *irc.Event) {
71119
for k := range i.Connection.Channels {
@@ -76,8 +124,11 @@ func (i *ircListener) nickTrackQuit(e *irc.Event) {
76124
func (i *ircListener) OnJoinQuitSettingChange() {
77125
// Clear Nicktrack QUIT callback as it races with this
78126
i.ClearCallback("QUIT")
79-
i.ClearCallback("NICK")
80-
i.AddCallback("NICK", i.nickTrackNick)
127+
128+
if i.relayNickTrackID != 0 {
129+
i.RemoveCallback("NICK", i.relayNickTrackID)
130+
i.relayNickTrackID = 0
131+
}
81132

82133
// If remove callbacks...
83134
if !i.bridge.Config.ShowJoinQuit {
@@ -90,6 +141,8 @@ func (i *ircListener) OnJoinQuitSettingChange() {
90141
return
91142
}
92143

144+
i.relayNickTrackID = i.AddCallback("NICK", i.OnNickRelayToDiscord)
145+
93146
callbacks := []string{"JOIN", "PART", "QUIT", "KICK"}
94147
cbs := make(map[string]int, len(callbacks))
95148
for _, cb := range callbacks {

main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ func setupDiscordFormat(discordFormat map[string]string) (map[string]string, err
290290
"part": "_${NICK} left (${IDENT}@${HOST}) - ${CONTENT}_",
291291
"quit": "_${NICK} quit (${IDENT}@${HOST}) - Quit: ${CONTENT}_",
292292
"kick": "_${TARGET} was kicked by ${NICK} - ${CONTENT}_",
293+
"nick": "_${NICK} changed nick to ${CONTENT}_",
293294
}
294295

295296
for ev, format := range discordFormatDefaults {

0 commit comments

Comments
 (0)