diff --git a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs index b6de14f..1e60011 100644 --- a/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs +++ b/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs @@ -485,6 +485,14 @@ namespace Smuxi.Engine CommandPing(command); handled = true; break; + case "version": + CommandVersion(command); + handled = true; + break; + case "time": + CommandTime(command); + handled = true; + break; case "who": CommandWho(command); handled = true; @@ -655,6 +663,8 @@ namespace Smuxi.Engine "whois nick", "whowas nick", "ping nick", + "version nick", + "time nick", "mode new-mode", "away [away-message]", "kick nick(s) [reason]", @@ -1008,6 +1018,28 @@ namespace Smuxi.Engine } } + public void CommandVersion(CommandModel cd) + { + if (cd.DataArray.Length >= 2) { + string destination = cd.DataArray[1]; + Session.AddTextToChat(_NetworkChat, "[ctcp(" + destination + ")] VERSION"); + _IrcClient.SendMessage(SendType.CtcpRequest, destination, "VERSION"); + } else { + _NotEnoughParameters(cd); + } + } + + public void CommandTime(CommandModel cd) + { + if (cd.DataArray.Length >= 2) { + string destination = cd.DataArray[1]; + Session.AddTextToChat(_NetworkChat, "[ctcp(" + destination + ")] TIME"); + _IrcClient.SendMessage(SendType.CtcpRequest, destination, "TIME"); + } else { + _NotEnoughParameters(cd); + } + } + public void CommandWho(CommandModel cd) { if (cd.DataArray.Length < 2) { diff --git a/src/Frontend-GNOME-IRC/IrcGroupChatView.cs b/src/Frontend-GNOME-IRC/IrcGroupChatView.cs index 6574c04..efbd8e3 100644 --- a/src/Frontend-GNOME-IRC/IrcGroupChatView.cs +++ b/src/Frontend-GNOME-IRC/IrcGroupChatView.cs @@ -93,6 +93,23 @@ namespace Smuxi.Frontend.Gnome Gtk.ImageMenuItem whois_item = new Gtk.ImageMenuItem(_("Whois")); whois_item.Activated += _OnUserListMenuWhoisActivated; PersonMenu.Append(whois_item); + + Gtk.ImageMenuItem ctcp_item = new Gtk.ImageMenuItem(_("CTCP")); + Gtk.Menu ctcp_submenu = new Gtk.Menu(); + Gtk.ImageMenuItem ctcp_version_item = new Gtk.ImageMenuItem(_("Version")); + ctcp_version_item.Activated += _OnUserListMenuCTCPVersionActivated; + ctcp_submenu.Append(ctcp_version_item); + + Gtk.ImageMenuItem ctcp_ping_item = new Gtk.ImageMenuItem(_("Ping")); + ctcp_ping_item.Activated += _OnUserListMenuCTCPPingActivated; + ctcp_submenu.Append(ctcp_ping_item); + + Gtk.ImageMenuItem ctcp_time_item = new Gtk.ImageMenuItem(_("Time")); + ctcp_time_item.Activated += _OnUserListMenuCTCPTimeActivated; + ctcp_submenu.Append(ctcp_time_item); + + ctcp_item.Submenu = ctcp_submenu; + PersonMenu.Append(ctcp_item); } if (PersonTreeView != null) { @@ -360,6 +377,66 @@ namespace Smuxi.Frontend.Gnome } } + private void _OnUserListMenuCTCPVersionActivated(object sender, EventArgs e) + { + Trace.Call(sender, e); + + IList persons = GetSelectedPersons(); + if (persons == null) { + return; + } + + foreach (PersonModel person in persons) { + _IrcProtocolManager.CommandVersion( + new CommandModel( + Frontend.FrontendManager, + ChatModel, + person.ID + ) + ); + } + } + + private void _OnUserListMenuCTCPPingActivated(object sender, EventArgs e) + { + Trace.Call(sender, e); + + IList persons = GetSelectedPersons(); + if (persons == null) { + return; + } + + foreach (PersonModel person in persons) { + _IrcProtocolManager.CommandPing( + new CommandModel( + Frontend.FrontendManager, + ChatModel, + person.ID + ) + ); + } + } + + private void _OnUserListMenuCTCPTimeActivated(object sender, EventArgs e) + { + Trace.Call(sender, e); + + IList persons = GetSelectedPersons(); + if (persons == null) { + return; + } + + foreach (PersonModel person in persons) { + _IrcProtocolManager.CommandTime( + new CommandModel( + Frontend.FrontendManager, + ChatModel, + person.ID + ) + ); + } + } + protected override void OnPersonsRowActivated(object sender, Gtk.RowActivatedArgs e) { Trace.Call(sender, e);