public override bool SupportsItem(Item item) { Pidgin.IPurpleObject prpl = Pidgin.GetPurpleObject(); PidginAccountItem account = item as PidginAccountItem; return(prpl.PurpleAccountIsConnected(account.Id)); }
public override void UpdateItems() { Pidgin.IPurpleObject prpl; int [] rawStatuses; if (Pidgin.InstanceIsRunning) { try { prpl = Pidgin.GetPurpleObject(); foreach (Item status in statuses.Where(i => i is PidginSavedStatusItem).ToArray()) { statuses.Remove(status); } rawStatuses = prpl.PurpleSavedstatusesGetAll(); foreach (int status in rawStatuses) { if (!prpl.PurpleSavedstatusIsTransient(status)) { int id, statId; string title, message; title = prpl.PurpleSavedstatusGetTitle(status); id = prpl.PurpleSavedstatusFind(title); statId = prpl.PurpleSavedstatusGetType(status); message = prpl.PurpleSavedstatusGetMessage(status); statuses.Add(new PidginSavedStatusItem(title, message, id, statId)); } } } catch (Exception e) { Log <PidginSavedStatusItemSource> .Error("Could not read saved statuses: {0}", e.Message); Log <PidginSavedStatusItemSource> .Debug(e.StackTrace); } } }
public override IEnumerable <Item> ChildrenOfItem(Item item) { if (Pidgin.IsPidgin(item)) { yield return(new PidginBrowseBuddyItem()); } else if (item is PidginBrowseBuddyItem) { foreach (ContactItem buddy in buddies) { yield return(buddy); } } else if (item is ContactItem) { ContactItem buddy = item as ContactItem; IEnumerable <string> icons = buddy.Details.Where(d => d.StartsWith(iconPrefix + "prpl-")); IEnumerable <Item> details = buddy.Details .Where(d => d.StartsWith("prpl-")) .Select(d => MakeChildren(buddy, d, icons)) .OfType <Item> (); foreach (Item detail in details) { yield return(detail); } } }
//We're only using this to get link-local (bonjour) buddies ContactItem CreateBuddy(int buddyID) { ContactItem buddy; string alias, proto, icon, accountAlias; proto = "prpl-bonjour"; icon = Pidgin.GetBuddyIconPath(buddyID); alias = Pidgin.GetBuddyServerAlias(buddyID); accountAlias = Pidgin.GetBuddyLocalAlias(buddyID); buddy = ContactItem.Create(alias); //if for some reason this buddy has multiple prpl-bonjour accounts associated with it //make sure we add them all in this fashion: prpl-bonjour, prpl-bonjour-1, etc. int similarProtos = buddy.Details.Where(k => k.StartsWith(proto)).Count(); if (similarProtos > 0) { proto = string.Format("{0}-{1}", proto, similarProtos.ToString()); } buddy[proto] = accountAlias; if (!string.IsNullOrEmpty(icon)) { buddy[iconPrefix + proto] = icon; } if (string.IsNullOrEmpty(buddy["photo"])) { buddy["photo"] = icon; } return(buddy); }
public PidginHandleContactDetailItem(string proto, string handle, string custom_icon) { this.proto = proto; this.handle = handle; this.custom_icon = custom_icon; this.online = (Pidgin.BuddyIsOnline(handle)) ? AddinManager.CurrentLocalizer.GetString("Online") : AddinManager.CurrentLocalizer.GetString("Offline"); }
public override IEnumerable <Item> Perform(IEnumerable <Item> items, IEnumerable <Item> modItems) { List <string> names = new List <string> (); string message = ""; if (modItems.Any()) { message = (modItems.First() as ITextItem).Text; } foreach (Item item in items) { if (item is ContactItem) { // Just grab the first protocol we see. ContactItem contact = item as ContactItem; foreach (string detail in contact.Details) { if (!detail.StartsWith("prpl-")) { continue; } //if this buddy is online, add and break if (Pidgin.BuddyIsOnline(contact[detail])) { names.Add(contact[detail]); break; } } } else if (item is PidginHandleContactDetailItem) { names.Add((item as PidginHandleContactDetailItem).Value); } } if (names.Count > 0) { Services.Application.RunOnThread(() => { Pidgin.StartIfNeccessary(); Services.Application.RunOnMainThread(() => { foreach (string name in names) { if (!string.IsNullOrEmpty(message)) { Pidgin.OpenConversationWithBuddy(name, message); } else { Pidgin.OpenConversationWithBuddy(name); } } }); }); } yield break; }
public override bool SupportsItem(Item item) { if (item is ContactItem) { ContactItem contact = item as ContactItem; return(contact.Details.Where(d => Pidgin.BuddyIsOnline(contact[d])).Any()); } return(true); }
public override bool SupportsItem(Item item) { Pidgin.IPurpleObject prpl; try { prpl = Pidgin.GetPurpleObject(); if (!prpl.PurpleAccountIsConnected((item as PidginAccountItem).Id)) { return(true); } } catch { } return(false); }
public override IEnumerable <Item> ChildrenOfItem(Item item) { if (Pidgin.IsPidgin(item)) { yield return(new PidginBrowseStatusItem()); } else if (item is PidginBrowseStatusItem) { foreach (Item status in statuses) { yield return(status); } } }
public override IEnumerable <Item> ChildrenOfItem(Item item) { if (Pidgin.IsPidgin(item)) { yield return(new PidginBrowseAccountItem()); } else if (item is PidginBrowseAccountItem) { foreach (PidginAccountItem account in items) { yield return(account); } } }
public override IEnumerable <Item> Perform(IEnumerable <Item> items, IEnumerable <Item> modItems) { int status; string message = ""; try { Pidgin.IPurpleObject prpl = Pidgin.GetPurpleObject(); if (items.First() is PidginSavedStatusItem) { status = (items.First() as PidginSavedStatusItem).ID; prpl.PurpleSavedstatusActivate(status); } else if (items.First() is PidginStatusTypeItem) { status = (items.First() as PidginStatusTypeItem).Status; if (modItems.Any()) { message = (modItems.First() as ITextItem).Text; } Pidgin.PurpleSetAvailabilityStatus(status, message); } else if (items.First() is ITextItem) { if (modItems.Any()) { status = (modItems.First() as PidginStatusTypeItem).Status; } else { status = prpl.PurpleSavedstatusGetType(prpl.PurpleSavedstatusGetCurrent()); } message = (items.First() as ITextItem).Text; Pidgin.PurpleSetAvailabilityStatus(status, message); } } catch (Exception e) { Log <PidginSetStatusAction> .Error("Could not set Pidgin status: {0}", e.Message); Log <PidginSetStatusAction> .Debug(e.StackTrace); } yield break; }
public override IEnumerable <Item> Perform(IEnumerable <Item> items, IEnumerable <Item> modItems) { Pidgin.IPurpleObject prpl; PidginAccountItem account = items.First() as PidginAccountItem; try { prpl = Pidgin.GetPurpleObject(); try { prpl.PurpleAccountSetEnabled(account.Id, gtkGaim, (int)0); } catch { prpl.PurpleAccountSetEnabled(account.Id, gtkGaim, (uint)0); } } catch (Exception e) { Log <PidginDisableAccount> .Error("Could not disable Pidgin account: {0}", e.Message); Log <PidginDisableAccount> .Debug(e.StackTrace); } yield break; }
public override void UpdateItems() { Pidgin.IPurpleObject prpl; prpl = Pidgin.GetPurpleObject(); string name, proto; if (Pidgin.InstanceIsRunning) { items.Clear(); try { foreach (int account in prpl.PurpleAccountsGetAll()) { proto = prpl.PurpleAccountGetProtocolName(account); name = prpl.PurpleAccountGetUsername(account); items.Add(new PidginAccountItem(name, proto, account)); } } catch (Exception e) { Log <PidginAccountItemSource> .Error("Could not get Pidgin accounts: {0}", e.Message); Log <PidginAccountItemSource> .Debug(e.StackTrace); } } }
ContactItem CreateBuddy(XmlNode buddyNode) { ContactItem buddy; string name, alias, proto; Dictionary <string, string> icons = new Dictionary <string, string> (); Dictionary <string, string> protos = new Dictionary <string, string> (); alias = name = null; //we favor aliases in this order: metacontact alias, local alias, server alias //metacontact alias try { alias = buddyNode.Attributes.GetNamedItem("alias").Value; } catch {} foreach (XmlNode node in buddyNode.ChildNodes) { switch (node.Name) { case "buddy": proto = node.Attributes.GetNamedItem("proto").Value; //for metacontacts, add similar protocol keys like this: // prpl-msn, prpl-msn-1, prpl-msn-2 etc. int similarProtos = protos.Keys.Where(k => k.StartsWith(proto)).Count(); if (similarProtos > 0) { proto = string.Format("{0}-{1}", proto, similarProtos.ToString()); } foreach (XmlNode attr in node.ChildNodes) { switch (attr.Name) { // The screen name. case "name": protos[proto] = attr.InnerText; break; // The alias, or real name, only if one isn't set yet. case "alias": if (string.IsNullOrEmpty(alias)) { alias = attr.InnerText; } break; // Buddy icon image file. case "setting": if (attr.Attributes.GetNamedItem("name").Value == "buddy_icon") { icons[iconPrefix + proto] = Path.Combine(BuddyIconDirectory, attr.InnerText); if (!icons.Keys.Contains("default")) { icons["default"] = icons[iconPrefix + proto]; } } break; } } //if the alias is still null, let's try to get the server alias if (string.IsNullOrEmpty(alias)) { alias = (string)Pidgin.GetBuddyServerAlias(protos[proto]) ?? null; } break; //let's pick up the custom icon as the metacontact's icon case "setting": if (node.Attributes.GetNamedItem("name").Value == "custom_buddy_icon") { icons["default"] = Path.Combine(BuddyIconDirectory, node.InnerText); } break; } } //in case we don't have an alias, take one of the proto values for the name name = alias ?? protos.Values.FirstOrDefault(); // If crucial details are missing, we can't make a buddy. if (name == null || protos.Values.Count() <= 0) { return(null); } // Create a new buddy, add the details we have. buddy = ContactItem.Create(alias ?? name); //assign the default buddy icon as the ContactItem's photo if (icons.Keys.Contains("default")) { buddy["photo"] = icons["default"]; } //add all of the protocol handles we found for this buddy //skip bonjour keys, they'll get picked up later foreach (string k in protos.Keys.Where(k => !k.Contains("bonjour"))) { buddy[k] = protos[k]; } //add the icons keys to create individual icons for childitems foreach (string k in icons.Keys.Where(k => k != "default" && !k.Contains("bonjour"))) { buddy[k] = icons[k]; } return(buddy); }
public override void UpdateItems() { XmlDocument blist; // Add buddies as they are encountered to this hash so we don't create duplicates. Dictionary <ContactItem, bool> buddies_seen; //remove pidgin related keys from the buddies foreach (ContactItem buddy in buddies) { foreach (string key in buddy.Details.Where(d => d.Contains("prpl")).ToArray()) { buddy[key] = ""; } } buddies.Clear(); buddies_seen = new Dictionary <ContactItem, bool> (); //load buddies from xml file blist = new XmlDocument(); try { blist.Load(BuddyListFile); foreach (XmlNode contact_node in blist.GetElementsByTagName("contact")) { ContactItem buddy; buddy = CreateBuddy(contact_node); if (buddy == null) { continue; } buddies_seen[buddy] = true; } } catch (Exception e) { Log <PidginContactItemSource> .Error("Error reading Pidgin buddy list file: {0}", e.Message); Log <PidginContactItemSource> .Debug(e.StackTrace); } //if Pidgin is running, find bonjour buddies from dbus //link-local (bonjour) buddies do not get added to the xml file try { int bonjourAccount = Pidgin.GetAccountID("", "prpl-bonjour"); if (bonjourAccount != -1) { foreach (int buddyID in Pidgin.FindBuddies(bonjourAccount, "")) { ContactItem buddy; buddy = CreateBuddy(buddyID); buddies_seen [buddy] = true; } } } catch (Exception e) { Log <PidginContactItemSource> .Error("Error reading Bonjour buddies: {0}", e.Message); Log <PidginContactItemSource> .Debug(e.StackTrace); } foreach (ContactItem buddy in buddies_seen.Keys) { buddies.Add(buddy); } }
public PidginHandleContactDetailItem(string proto, string handle) : this(proto, handle, Pidgin.GetProtocolIcon(proto)) { }