public void CommandContact(CommandModel cd)
{
FrontendManager fm = cd.FrontendManager;
// todo: allow length of 2 in private chat windows
if (cd.DataArray.Length < 3) {
NotEnoughParameters(cd);
return;
}
Jid jid = GetJidFromNickname(cd.DataArray[2]);
string cmd = cd.DataArray[1];
// the logic here is taken from
// http://xmpp.org/rfcs/rfc3921.html#int
switch (cmd) {
case "addgroup":
if (cd.DataArray.Length < 4) {
NotEnoughParameters(cd);
return;
}
JabberClient.RosterManager.AddRosterItem(jid, null, cd.DataArray[3]);
break;
case "addonly":
JabberClient.RosterManager.AddRosterItem(jid);
break;
case "add":
XmppPersonModel person;
if (Contacts.TryGetValue(jid.Bare, out person)) {
if (person.Subscription == SubscriptionType.both) break;
if (person.Subscription != SubscriptionType.to) {
JabberClient.PresenceManager.Subscribe(jid);
}
if (person.Subscription != SubscriptionType.from) {
// in case we already know this contact… but he can't see us
JabberClient.PresenceManager.ApproveSubscriptionRequest(jid);
}
} else {
JabberClient.RosterManager.AddRosterItem(jid);
JabberClient.PresenceManager.Subscribe(jid);
JabberClient.PresenceManager.ApproveSubscriptionRequest(jid);
}
break;
case "subscribe":
JabberClient.PresenceManager.Subscribe(jid);
break;
case "unsubscribe":
// stop receiving status updates from this contact
// that contact will still receive your updates
JabberClient.PresenceManager.Unsubscribe(jid);
break;
case "remove":
case "rm":
case "del":
case "delete":
JabberClient.RosterManager.RemoveRosterItem(jid);
// unsubscribing is unnecessary, the server is required to do this
break;
case "accept":
case "allow":
case "approve":
case "auth":
case "authorize":
JabberClient.PresenceManager.ApproveSubscriptionRequest(jid);
break;
case "deny":
case "refuse":
// stop the contact from receiving your updates
// you will still receive the contact's status updates
JabberClient.PresenceManager.RefuseSubscriptionRequest(jid);
break;
case "rename":
if (cd.DataArray.Length < 4) {
JabberClient.RosterManager.UpdateRosterItem(jid, "");
} else {
var newNick = String.Join(" ", cd.DataArray.Skip(3).ToArray());
JabberClient.RosterManager.UpdateRosterItem(jid, newNick);
}
break;
default:
var builder = CreateMessageBuilder();
builder.AppendText(_("Invalid contact command: {0}"), cmd);
Session.AddMessageToFrontend(cd, builder.ToMessage());
return;
}
}