[smuxi/stable] Engine-IRC: fix parsing non-RFC mode prefixes in NAMES(X) messages
- From: Mirco M. M. Bauer <mmmbauer src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [smuxi/stable] Engine-IRC: fix parsing non-RFC mode prefixes in NAMES(X) messages
- Date: Sat, 28 May 2016 12:14:34 +0000 (UTC)
commit 0becb1d72ef53b95080a5be03fbdf0613999ff20
Author: Mirco Bauer <meebey meebey net>
Date: Sat May 28 14:04:13 2016 +0200
Engine-IRC: fix parsing non-RFC mode prefixes in NAMES(X) messages
src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs | 72 ++++++++++---------
1 files changed, 38 insertions(+), 34 deletions(-)
---
diff --git a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
index 0b4ad8d..5cff731 100644
--- a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
+++ b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs
@@ -1,7 +1,7 @@
/*
* Smuxi - Smart MUltipleXed Irc
*
- * Copyright (c) 2005-2015 Mirco Bauer <meebey meebey net>
+ * Copyright (c) 2005-2016 Mirco Bauer <meebey meebey net>
*
* Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
*
@@ -3244,39 +3244,43 @@ namespace Smuxi.Engine
if (user.TrimEnd(' ').Length == 0) {
continue;
}
- string username = user;
-
- switch (user[0]) {
- case '@':
- case '+':
- // RFC VIOLATION
- // some IRC network do this and break our nice smuxi...
- case '&':
- case '%':
- case '~':
- case '!':
- case '.':
- username = user.Substring(1);
- break;
- }
-
- var groupPerson = CreateGroupPerson(username);
- switch (user[0]) {
- case '~':
- groupPerson.IsOwner = true;
- break;
- case '&':
- groupPerson.IsChannelAdmin = true;
- break;
- case '@':
- groupPerson.IsOp = true;
- break;
- case '%':
- groupPerson.IsHalfop = true;
- break;
- case '+':
- groupPerson.IsVoice = true;
- break;
+ string nick = user;
+ var modePrefixes = new List<char>();
+ bool checkNextChar;
+ // this has to be a loop since there could be multiple prefixes (NAMESX):
+ // :irc.poop.nl 353 meebey3 @ #gtk# :meebey3 FHaag1 shana knocte ~ meebey stsundermann
antonius Bertrand
+ do {
+ checkNextChar = false;
+ foreach (var kvp in _IrcClient.ServerProperties.ChannelPrivilegeModesPrefixes) {
+ if (nick[0] == kvp.Value) {
+ // first char of the nick is a mode prefix, thus strip it
+ modePrefixes.Add(nick[0]);
+ nick = nick.Substring(1);
+ checkNextChar = true;
+ break;
+ }
+ }
+ } while (checkNextChar);
+
+ var groupPerson = CreateGroupPerson(nick);
+ foreach (char modePrefix in modePrefixes) {
+ switch (modePrefix) {
+ case '~':
+ groupPerson.IsOwner = true;
+ break;
+ case '&':
+ groupPerson.IsChannelAdmin = true;
+ break;
+ case '@':
+ groupPerson.IsOp = true;
+ break;
+ case '%':
+ groupPerson.IsHalfop = true;
+ break;
+ case '+':
+ groupPerson.IsVoice = true;
+ break;
+ }
}
// HACK: replace existing value in case we get duplicate nicks
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]