[smuxi: 2/3] Engine-IRC: tolerate duplicate nicks in RPL_NAMREPLY (closes: #1051)



commit 83a609d02d2b5e961f146e72978b521c5d58be23
Author: Mirco Bauer <meebey meebey net>
Date:   Sun May 3 22:58:33 2015 +0200

    Engine-IRC: tolerate duplicate nicks in RPL_NAMREPLY (closes: #1051)
    
    irc.gitter.im sent duplicate nicks in RPL_NAMREPLY for some reason and triggered
    an exception in Smuxi's IRC engine:
    
        2015-05-03 22:17:11,149 [IrcProtocolManager (irc.gitter.im:6697) listener] ERROR 
Smuxi.Engine.IrcProtocolManager - _Run(): exception in _Listen() occurred!
        System.ArgumentException: An element with the same key already exists in the dictionary.
          at System.Collections.Generic.Dictionary`2[System.String,Smuxi.Engine.PersonModel].Add 
(System.String key, Smuxi.Engine.PersonModel value) [0x00171] in 
/tmp/buildd/mono-2.6.7/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:429
          at Smuxi.Engine.IrcProtocolManager._OnNames (System.Object sender, 
Meebey.SmartIrc4net.NamesEventArgs e) [0x00000] in <filename unknown>:0
          at Meebey.SmartIrc4net.IrcClient._Event_RPL_NAMREPLY (Meebey.SmartIrc4net.IrcMessageData ircdata) 
[0x00408] in /usr/local/src/smuxi-cloud/lib/SmartIrc4net/src/IrcClient/IrcClient.cs:2816
          at Meebey.SmartIrc4net.IrcClient._HandleEvents (Meebey.SmartIrc4net.IrcMessageData ircdata) 
[0x00349] in /usr/local/src/smuxi-cloud/lib/SmartIrc4net/src/IrcClient/IrcClient.cs:1511
          at Meebey.SmartIrc4net.IrcClient._Worker (System.Object sender, 
Meebey.SmartIrc4net.ReadLineEventArgs e) [0x00000] in 
/usr/local/src/smuxi-cloud/lib/SmartIrc4net/src/IrcClient/IrcClient.cs:1169
          at (wrapper delegate-invoke) 
Meebey.SmartIrc4net.ReadLineEventHandler:invoke_void__this___object_ReadLineEventArgs 
(object,Meebey.SmartIrc4net.ReadLineEventArgs)
          at (wrapper delegate-invoke) 
Meebey.SmartIrc4net.ReadLineEventHandler:invoke_void__this___object_ReadLineEventArgs 
(object,Meebey.SmartIrc4net.ReadLineEventArgs)
          at Meebey.SmartIrc4net.IrcConnection.ReadLine (Boolean blocking) [0x000bb] in 
/usr/local/src/smuxi-cloud/lib/SmartIrc4net/src/IrcConnection/IrcConnection.cs:902
          at Meebey.SmartIrc4net.IrcConnection.Listen (Boolean blocking) [0x0000b] in 
/usr/local/src/smuxi-cloud/lib/SmartIrc4net/src/IrcConnection/IrcConnection.cs:841
          at Meebey.SmartIrc4net.IrcConnection.Listen () [0x00000] in 
/usr/local/src/smuxi-cloud/lib/SmartIrc4net/src/IrcConnection/IrcConnection.cs:855
          at Smuxi.Engine.IrcProtocolManager._Listen () [0x00000] in <filename unknown>:0

 src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)
---
diff --git a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs 
b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
index d950dd8..42c83a7 100644
--- a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
+++ b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
@@ -3246,8 +3246,11 @@ namespace Smuxi.Engine
                         groupPerson.IsVoice = true;
                         break;
                 }
-                
-                groupChat.UnsafePersons.Add(groupPerson.NickName, groupPerson);
+
+                // HACK: replace existing value in case we get duplicate nicks
+                // on broken IRC servers like irc.gitter.im, see:
+                // https://smuxi.im/issues/show/1051
+                groupChat.UnsafePersons[groupPerson.NickName] = groupPerson;
 #if LOG4NET
                 // logging noise
                 //_Logger.Debug("_OnNames() added user: " + username + " to: " + groupChat.Name);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]