diff -urN smuxi-0.6.2.orig/src/Engine-IRC/Protocols/Irc/IrcGroupPersonModel.cs smuxi-0.6.2/src/Engine-IRC/Protocols/Irc/IrcGroupPersonModel.cs --- smuxi-0.6.2.orig/src/Engine-IRC/Protocols/Irc/IrcGroupPersonModel.cs 2007-11-11 18:54:33.000000000 +0100 +++ smuxi-0.6.2/src/Engine-IRC/Protocols/Irc/IrcGroupPersonModel.cs 2008-12-04 17:44:46.000000000 +0100 @@ -39,6 +39,7 @@ private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private bool _IsOp; + private bool _IsHalfop; private bool _IsVoice; public bool IsOp { @@ -50,6 +51,15 @@ } } + public bool IsHalfop { + get { + return _IsHalfop; + } + internal set { + _IsHalfop = value; + } + } + public bool IsVoice { get { return _IsVoice; @@ -88,6 +98,7 @@ base.GetObjectData(sw); sw.Write(_IsOp); + sw.Write(_IsHalfop); sw.Write(_IsVoice); } @@ -99,8 +110,9 @@ base.SetObjectData(sr); - _IsOp = sr.ReadBoolean(); - _IsVoice = sr.ReadBoolean(); + _IsOp = sr.ReadBoolean(); + _IsHalfop = sr.ReadBoolean(); + _IsVoice = sr.ReadBoolean(); } } } diff -urN smuxi-0.6.2.orig/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs smuxi-0.6.2/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs --- smuxi-0.6.2.orig/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs 2008-08-25 21:27:58.000000000 +0200 +++ smuxi-0.6.2/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs 2008-12-04 17:55:52.000000000 +0100 @@ -153,6 +153,8 @@ _IrcClient.OnNickChange += new NickChangeEventHandler(_OnNickChange); _IrcClient.OnOp += new OpEventHandler(_OnOp); _IrcClient.OnDeop += new DeopEventHandler(_OnDeop); + _IrcClient.OnHalfop += new HalfopEventHandler(_OnHalfop); + _IrcClient.OnDehalfop += new DehalfopEventHandler(_OnDehalfop); _IrcClient.OnVoice += new VoiceEventHandler(_OnVoice); _IrcClient.OnDevoice += new DevoiceEventHandler(_OnDevoice); _IrcClient.OnModeChange += new IrcEventHandler(_OnModeChange); @@ -548,6 +550,14 @@ CommandDeop(command); handled = true; break; + case "halfop": + CommandHalfop(command); + handled = true; + break; + case "dehalfop": + CommandDehalfop(command); + handled = true; + break; case "voice": CommandVoice(command); handled = true; @@ -661,6 +671,8 @@ "devoice nick", "op nick", "deop nick", + "halfop nick", + "dehalfop nick", "nick newnick", "ctcp destination command [data]", "raw/quote irccommand", @@ -1019,6 +1031,8 @@ mode = _("IRC Op"); } else if (info.IsOp) { mode = _("Op"); + } else if (info.IsHalfop) { + mode = _("Halfop"); } else if (info.IsVoice) { mode = _("Voice"); } else { @@ -1113,6 +1127,42 @@ } } + public void CommandHalfop(CommandModel cd) + { + ChatModel chat = cd.FrontendManager.CurrentChat; + string channel = chat.ID; + if (cd.DataArray.Length == 2) { + _IrcClient.Halfop(channel, cd.Parameter); + } else if (cd.DataArray.Length > 2) { + string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); + foreach (string nick in candidates) { + _IrcClient.Halfop(channel, nick); + } + /* + // requires SmartIrc4net >= 0.4.6 + _IrcClient.Halfop(channel, candidates); + */ + } else { + _NotEnoughParameters(cd); + } + } + + public void CommandDehalfop(CommandModel cd) + { + ChatModel chat = cd.FrontendManager.CurrentChat; + string channel = chat.ID; + if (cd.DataArray.Length == 2) { + _IrcClient.Dehalfop(channel, cd.Parameter); + } else if (cd.DataArray.Length > 2) { + string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); + foreach(string nick in candidates) { + _IrcClient.Dehalfop(channel, nick); + } + } else { + _NotEnoughParameters(cd); + } + } + public void CommandVoice(CommandModel cd) { ChatModel chat = cd.FrontendManager.CurrentChat; @@ -2361,6 +2411,34 @@ #endif } } + + private void _OnHalfop(object sender, HalfopEventArgs e) + { + GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); + IrcGroupPersonModel user = (IrcGroupPersonModel)cchat.GetPerson(e.Whom); + if (user != null) { + user.IsHalfop = true; + Session.UpdatePersonInGroupChat(cchat, user, user); +#if LOG4NET + } else { + _Logger.Error("_OnHalfop(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); +#endif + } + } + + private void _OnDehalfop(object sender, DehalfopEventArgs e) + { + GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); + IrcGroupPersonModel user = (IrcGroupPersonModel)cchat.GetPerson(e.Whom); + if (user != null) { + user.IsHalfop = false; + Session.UpdatePersonInGroupChat(cchat, user, user); +#if LOG4NET + } else { + _Logger.Error("_OnDehalfop(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); +#endif + } + } private void _OnVoice(object sender, VoiceEventArgs e) { diff -urN smuxi-0.6.2.orig/src/Frontend-GNOME-IRC/IrcGroupChatView.cs smuxi-0.6.2/src/Frontend-GNOME-IRC/IrcGroupChatView.cs --- smuxi-0.6.2.orig/src/Frontend-GNOME-IRC/IrcGroupChatView.cs 2008-08-24 02:12:51.000000000 +0200 +++ smuxi-0.6.2/src/Frontend-GNOME-IRC/IrcGroupChatView.cs 2008-12-04 17:42:30.000000000 +0100 @@ -60,6 +60,14 @@ deop_item.Activated += new EventHandler(_OnUserListMenuDeopActivated); PersonMenu.Append(deop_item); + Gtk.ImageMenuItem halfop_item = new Gtk.ImageMenuItem(_("Halfop")); + halfop_item.Activated += new EventHandler(_OnUserListMenuHalfopActivated); + PersonMenu.Append(halfop_item); + + Gtk.ImageMenuItem dehalfop_item = new Gtk.ImageMenuItem(_("Dehalfop")); + dehalfop_item.Activated += new EventHandler(_OnUserListMenuDehalfopActivated); + PersonMenu.Append(dehalfop_item); + Gtk.ImageMenuItem voice_item = new Gtk.ImageMenuItem(_("Voice")); voice_item.Activated += new EventHandler(_OnUserListMenuVoiceActivated); PersonMenu.Append(voice_item); @@ -135,6 +143,8 @@ string mode; if (person.IsOp) { mode = "@"; + } elseif (person.IsHalfop) { + mode = "%"; } else if (person.IsVoice) { mode = "+"; } else { @@ -188,6 +198,52 @@ ) ); } + + private void _OnUserListMenuHalfopActivated(object sender, EventArgs e) + { + Trace.Call(sender, e); + + IList persons = GetSelectedPersons(); + if (persons == null) { + return; + } + + // do smart mode changes + List nicks = new List(); + foreach (PersonModel person in persons) { + nicks.Add(person.ID); + } + _IrcProtocolManager.CommandHalfop( + new CommandModel( + Frontend.FrontendManager, + ChatModel, + String.Join(" ", nicks.ToArray()) + ) + ); + } + + private void _OnUserListMenuDehalfopActivated(object sender, EventArgs e) + { + Trace.Call(sender, e); + + IList persons = GetSelectedPersons(); + if (persons == null) { + return; + } + + // do smart mode changes + List nicks = new List(); + foreach (PersonModel person in persons) { + nicks.Add(person.ID); + } + _IrcProtocolManager.CommandDehalfop( + new CommandModel( + Frontend.FrontendManager, + ChatModel, + String.Join(" ", nicks.ToArray()) + ) + ); + } private void _OnUserListMenuVoiceActivated(object sender, EventArgs e) {