PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/Code/Channels/Yammer/YammerClientChannel.cs

http://github.com/waseems/inbox2_desktop
C# | 300 lines | 238 code | 62 blank | 0 comment | 8 complexity | 81c5968dd2613be39313629de9325b89 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Xml.Linq;
  5. using Inbox2.Platform.Channels.Entities;
  6. using Inbox2.Platform.Channels.Interfaces;
  7. using Inbox2.Platform.Framework.OAuth;
  8. using Inbox2.Platform.Interfaces.Enumerations;
  9. namespace Inbox2.Channels.Yammer
  10. {
  11. public class YammerClientChannel : IClientInputChannel, IClientContactsChannel, IClientStatusUpdatesChannel
  12. {
  13. #region Properties
  14. public IChannelCredentialsProvider CredentialsProvider { get; set; }
  15. public string Hostname
  16. {
  17. get { return "http://twitter.com"; }
  18. set { }
  19. }
  20. public int Port
  21. {
  22. get { return 80; }
  23. set { }
  24. }
  25. public bool IsSecured
  26. {
  27. get { return false; }
  28. set { }
  29. }
  30. public int MaxConcurrentConnections
  31. {
  32. get { return 2; }
  33. set { }
  34. }
  35. public bool IsEnabled { get; set; }
  36. public string Protocol
  37. {
  38. get { return "Yammer API"; }
  39. }
  40. public string SourceAdress
  41. {
  42. get { return CredentialsProvider.GetCredentials().Claim; }
  43. }
  44. public string AuthMessage { get; private set; }
  45. #endregion
  46. public ConnectResult Connect()
  47. {
  48. return ConnectResult.Success;
  49. }
  50. public IEnumerable<ChannelFolder> GetFolders()
  51. {
  52. yield return new ChannelFolder("inbox", "inbox", ChannelFolderType.Inbox);
  53. }
  54. public void SelectFolder(ChannelFolder folder)
  55. {
  56. }
  57. public IEnumerable<ChannelMessageHeader> GetHeaders()
  58. {
  59. yield break;
  60. }
  61. public IEnumerable<ChannelMessage> GetMessage(ChannelMessageHeader header)
  62. {
  63. yield break;
  64. }
  65. public IEnumerable<ChannelContact> GetContacts()
  66. {
  67. foreach (var ycontact in GetYammerContacts())
  68. {
  69. var contact = new ChannelContact();
  70. contact.Person.Name = ycontact.FullName;
  71. contact.Profile.ChannelProfileKey = ycontact.Id;
  72. contact.Profile.ProfileType = ProfileType.Social;
  73. contact.Profile.ScreenName = ycontact.ScreenName;
  74. contact.Profile.Url = ycontact.Url;
  75. contact.Profile.Location = ycontact.Location;
  76. contact.Profile.Title = ycontact.Title;
  77. contact.Profile.SourceAddress = new SourceAddress(ycontact.ScreenName, ycontact.FullName);
  78. contact.Profile.ChannelAvatar = new ChannelAvatar();
  79. contact.Profile.ChannelAvatar.Url = ycontact.AvatarUrl;
  80. yield return contact;
  81. }
  82. }
  83. IClientContactsChannel IClientContactsChannel.Clone()
  84. {
  85. return new YammerClientChannel
  86. {
  87. Hostname = Hostname,
  88. Port = Port,
  89. IsSecured = IsSecured,
  90. MaxConcurrentConnections = MaxConcurrentConnections,
  91. CredentialsProvider = CredentialsProvider
  92. };
  93. }
  94. IEnumerable<YammerContact> GetYammerContacts()
  95. {
  96. int page = 1;
  97. while (true)
  98. {
  99. var result = YammerWebRequest.PerformRequest(new Uri("https://www.yammer.com/api/v1/users.xml?page=" + page),
  100. ChannelHelper.ConsumerKey, ChannelHelper.ConsumerSecret, ChannelHelper.Token, ChannelHelper.TokenSecret);
  101. if (result.Element("response").Elements().Count() == 0)
  102. yield break;
  103. foreach (var response in result.Elements("response").Elements("response"))
  104. yield return ParseYammerContact(response);
  105. page++;
  106. }
  107. }
  108. public ChannelSocialProfile GetProfile()
  109. {
  110. var result = YammerWebRequest.PerformRequest(new Uri("https://www.yammer.com/api/v1/users/current.xml"),
  111. ChannelHelper.ConsumerKey, ChannelHelper.ConsumerSecret, ChannelHelper.Token, ChannelHelper.TokenSecret);
  112. var contact = ParseYammerContact(result.Element("response"));
  113. return new ChannelSocialProfile
  114. {
  115. Id = contact.Id,
  116. FullName = contact.FullName,
  117. AvatarUrl = contact.AvatarUrl
  118. };
  119. }
  120. public IEnumerable<ChannelStatusUpdate> GetMentions(int pageSize)
  121. {
  122. yield break;
  123. }
  124. public IEnumerable<ChannelStatusUpdate> GetUpdates(int pageSize)
  125. {
  126. var contacts = GetYammerContacts();
  127. var result = YammerWebRequest.PerformRequest(new Uri("https://www.yammer.com/api/v1/messages.xml"),
  128. ChannelHelper.ConsumerKey, ChannelHelper.ConsumerSecret, ChannelHelper.Token, ChannelHelper.TokenSecret);
  129. var dict = new Dictionary<string, List<ChannelStatusUpdate>>();
  130. foreach (var element in result.Element("response").Elements("messages").Elements("message"))
  131. {
  132. var update = new ChannelStatusUpdate();
  133. var contact = contacts.First(c => c.Id == element.Element("sender-id").Value);
  134. update.ChannelStatusKey = element.Element("id").Value;
  135. update.From = new SourceAddress(contact.Id, contact.FullName, contact.AvatarUrl);
  136. update.Status = element.Element("body").Element("plain").Value;
  137. update.DatePosted = DateTime.Parse(element.Element("created-at").Value);
  138. foreach (var attachmentElement in element.Descendants("attachment"))
  139. {
  140. var attachment = new ChannelStatusUpdateAttachment();
  141. var type = attachmentElement.Element("type").Value;
  142. attachment.PreviewAltText = attachmentElement.Element("name").Value;
  143. attachment.TargetUrl = attachmentElement.Element("web-url").Value;
  144. if (type == "image")
  145. {
  146. attachment.MediaType = StatusAttachmentTypes.Photo;
  147. attachment.PreviewImageUrl = attachmentElement.Element("image").Element("thumbnail-url").Value;
  148. }
  149. else
  150. {
  151. attachment.MediaType = StatusAttachmentTypes.Document;
  152. }
  153. update.Attachments.Add(attachment);
  154. }
  155. var threadid = element.Element("thread-id").Value;
  156. if (!dict.ContainsKey(threadid))
  157. dict.Add(threadid, new List<ChannelStatusUpdate>());
  158. dict[threadid].Add(update);
  159. }
  160. var updates = new List<ChannelStatusUpdate>();
  161. foreach (var value in dict.Values)
  162. {
  163. var sortedList = value.OrderBy(c => c.DatePosted).ToList();
  164. var first = sortedList.First();
  165. first.Children.AddRange(sortedList.Skip(1));
  166. updates.Add(first);
  167. }
  168. return updates.OrderByDescending(s => s.SortDate);
  169. }
  170. public IEnumerable<ChannelStatusUpdate> GetUserUpdates(string username, int pageSize)
  171. {
  172. const string url = "https://www.yammer.com/api/v1/messages/from_user/{0}.xml";
  173. var result = YammerWebRequest.PerformRequest(new Uri(String.Format(url, username)),
  174. ChannelHelper.ConsumerKey, ChannelHelper.ConsumerSecret, ChannelHelper.Token, ChannelHelper.TokenSecret);
  175. foreach (var element in result.Element("response").Elements("messages").Elements("message"))
  176. {
  177. var update = new ChannelStatusUpdate();
  178. update.ChannelStatusKey = element.Element("id").Value;
  179. update.From = new SourceAddress(element.Element("sender-id").Value, username);
  180. update.Status = element.Element("body").Element("plain").Value;
  181. update.DatePosted = DateTime.Parse(element.Element("created-at").Value);
  182. yield return update;
  183. }
  184. }
  185. public IEnumerable<ChannelStatusUpdate> GetUpdates(string keyword, int pageSize)
  186. {
  187. yield break;
  188. }
  189. public void UpdateMyStatus(ChannelStatusUpdate update)
  190. {
  191. var p = new Dictionary<string, object> { {"body", update.Status} };
  192. if (!String.IsNullOrEmpty(update.InReplyTo))
  193. p.Add("replied_to_id", update.InReplyTo);
  194. YammerWebRequest.PerformRequest(new Uri("https://www.yammer.com/api/v1/messages/"), ChannelHelper.ConsumerKey,
  195. ChannelHelper.ConsumerSecret, ChannelHelper.Token, ChannelHelper.TokenSecret, p);
  196. }
  197. IClientStatusUpdatesChannel IClientStatusUpdatesChannel.Clone()
  198. {
  199. return new YammerClientChannel
  200. {
  201. Hostname = Hostname,
  202. Port = Port,
  203. IsSecured = IsSecured,
  204. MaxConcurrentConnections = MaxConcurrentConnections,
  205. CredentialsProvider = CredentialsProvider
  206. };
  207. }
  208. public bool Disconnect()
  209. {
  210. return true;
  211. }
  212. public IClientInputChannel Clone()
  213. {
  214. YammerClientChannel channel = new YammerClientChannel();
  215. channel.Hostname = Hostname;
  216. channel.Port = Port;
  217. channel.IsSecured = IsSecured;
  218. channel.MaxConcurrentConnections = MaxConcurrentConnections;
  219. channel.CredentialsProvider = CredentialsProvider;
  220. return channel;
  221. }
  222. YammerContact ParseYammerContact(XElement response)
  223. {
  224. YammerContact contact = new YammerContact();
  225. contact.Id = response.Element("id").Value;
  226. contact.ScreenName = response.Element("name").Value;
  227. contact.FullName = response.Element("full-name").Value;
  228. contact.Url = response.Element("web-url").Value;
  229. contact.Location = response.Element("location").Value;
  230. contact.Title = response.Element("job-title").Value;
  231. contact.AvatarUrl = response.Element("mugshot-url").Value;
  232. return contact;
  233. }
  234. public void Dispose()
  235. {
  236. }
  237. }
  238. }