@@ -13,11 +13,12 @@ type ircListener struct {
1313 bridge * Bridge
1414
1515 joinQuitCallbacks map [string ]int
16+ relayNickTrackID int
1617}
1718
1819func 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.
70118func (i * ircListener ) nickTrackQuit (e * irc.Event ) {
71119 for k := range i .Connection .Channels {
@@ -76,8 +124,11 @@ func (i *ircListener) nickTrackQuit(e *irc.Event) {
76124func (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 {
0 commit comments