PageRenderTime 34ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/Code/Channels/Hyves/HyvesClientChannel.cs

http://github.com/waseems/inbox2_desktop
C# | 273 lines | 214 code | 56 blank | 3 comment | 17 complexity | fe0f39455ac0a86ffbaf851c4ed79f83 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;
  6. using Inbox2.Platform.Channels.Entities;
  7. using Inbox2.Platform.Channels.Extensions;
  8. using Inbox2.Platform.Channels.Interfaces;
  9. using Inbox2.Platform.Channels.Web;
  10. namespace Inbox2.Channels.Hyves
  11. {
  12. public class HyvesClientChannel : IClientInputChannel, IClientOutputChannel, IClientContactsChannel
  13. {
  14. private string authToken;
  15. private string authSecret;
  16. #region Properties
  17. public IChannelCredentialsProvider CredentialsProvider { get; set; }
  18. public string Hostname
  19. {
  20. get { return "http://data.hyves-api.nl/"; }
  21. set { }
  22. }
  23. public int Port
  24. {
  25. get { return 80; }
  26. set { }
  27. }
  28. public bool IsSecured
  29. {
  30. get { return true; }
  31. set { }
  32. }
  33. public int MaxConcurrentConnections
  34. {
  35. get { return 2; }
  36. set { }
  37. }
  38. public bool IsEnabled { get; set; }
  39. public string Protocol
  40. {
  41. get { return "Hyves API"; }
  42. }
  43. public string SourceAdress
  44. {
  45. get { return CredentialsProvider.GetCredentials().Claim; }
  46. }
  47. public string AuthMessage { get; private set; }
  48. #endregion
  49. public ConnectResult Connect()
  50. {
  51. authToken = ChannelContext.Current.ClientContext.GetSetting("/Channels/Hyves/AuthToken").ToString();
  52. authSecret = ChannelContext.Current.ClientContext.GetSetting("/Channels/Hyves/AuthSecret").ToString();
  53. if (!String.IsNullOrEmpty(authToken) && !String.IsNullOrEmpty(authSecret))
  54. return ConnectResult.Success;
  55. return CredentialsProvider.ValidateCredentials();
  56. }
  57. public IEnumerable<ChannelFolder> GetFolders()
  58. {
  59. yield return new ChannelFolder("inbox", "inbox", ChannelFolderType.Inbox);
  60. }
  61. public void SelectFolder(ChannelFolder folder)
  62. {
  63. }
  64. public IEnumerable<ChannelMessageHeader> GetHeaders()
  65. {
  66. var messages =
  67. PerformRequest("http://data.hyves-api.nl/?ha_method=messages.getInbox&messagetype=member_to_member&ha_version=experimental&ha_format=xml&ha_fancylayout=true&ha_resultsperpage=50");
  68. foreach (var message in messages.Elements("message"))
  69. {
  70. yield return ParseHeader(message);
  71. }
  72. }
  73. public IEnumerable<ChannelMessage> GetMessage(ChannelMessageHeader header)
  74. {
  75. ChannelMessage message = new ChannelMessage();
  76. message.MessageNumber = header.MessageNumber;
  77. message.MessageIdentifier = header.MessageIdentifier;
  78. message.Context = header.Context;
  79. message.From = header.From;
  80. message.To.AddRange(header.To);
  81. message.InReplyTo = header.InReplyTo;
  82. message.BodyHtml = header.Body.ToStream();
  83. message.DateReceived = header.DateReceived;
  84. yield return message;
  85. }
  86. public IEnumerable<ChannelContact> GetContacts()
  87. {
  88. var friends =
  89. PerformRequest("http://data.hyves-api.nl/?ha_method=friends.get&ha_version=experimental&ha_format=xml&ha_fancylayout=true");
  90. List<string> friendsList = friends.Elements("userid").Select(e => e.Value).ToList();
  91. // Retrieve friends per 10 at a time
  92. for (int i = 0; i < friendsList.Count; i += 10)
  93. {
  94. // Creates lists like id1,id2,id3, etc
  95. var ids = String.Join(",", friendsList.Skip(i).Take(10).ToArray());
  96. var friend =
  97. PerformRequest(
  98. String.Format("http://data.hyves-api.nl/?userid={0}&ha_responsefields=profilepicture,cityname,countryname&ha_method=users.get&ha_version=experimental&ha_format=xml&ha_fancylayout=true", ids));
  99. foreach (var element in friend.Elements("user"))
  100. {
  101. yield return ParseContact(element);
  102. }
  103. }
  104. }
  105. IClientContactsChannel IClientContactsChannel.Clone()
  106. {
  107. return new HyvesClientChannel
  108. {
  109. Hostname = Hostname,
  110. Port = Port,
  111. IsSecured = IsSecured,
  112. MaxConcurrentConnections = MaxConcurrentConnections,
  113. CredentialsProvider = CredentialsProvider
  114. };
  115. }
  116. public void Send(ChannelMessage message)
  117. {
  118. foreach (var rcpt in message.To.Union(message.CC).Union(message.BCC))
  119. {
  120. PerformRequest(
  121. String.Format("http://data.hyves-api.nl/?title={0}&body={1}&target_userid={2}&ha_method=messages.send&ha_version=experimental&ha_format=xml&ha_fancylayout=true",
  122. message.Context,
  123. message.BodyHtml.ReadString().StripHtml(),
  124. rcpt.Address));
  125. }
  126. }
  127. public bool Disconnect()
  128. {
  129. return true;
  130. }
  131. public IClientInputChannel Clone()
  132. {
  133. HyvesClientChannel channel = new HyvesClientChannel();
  134. channel.Hostname = Hostname;
  135. channel.Port = Port;
  136. channel.IsSecured = IsSecured;
  137. channel.MaxConcurrentConnections = MaxConcurrentConnections;
  138. channel.CredentialsProvider = CredentialsProvider;
  139. return channel;
  140. }
  141. ChannelContact ParseContact(XElement source)
  142. {
  143. ChannelContact contact = new ChannelContact();
  144. contact.Person.Firstname = source.Element("firstname").Value;
  145. contact.Person.Lastname = source.Element("lastname").Value;
  146. contact.Person.Gender = source.Element("gender").Value;
  147. contact.Profile.ScreenName = contact.Person.Name;
  148. contact.Profile.ChannelProfileKey = source.Element("userid").Value;
  149. contact.Profile.ProfileType = ProfileType.Social;
  150. contact.Profile.Url = source.Element("url").Value;
  151. contact.Profile.SourceAddress =
  152. new SourceAddress(source.Element("userid").Value, contact.Person.Name);
  153. if (source.Element("cityname") != null)
  154. contact.Profile.City = source.Element("cityname").Value;
  155. if (source.Element("countryname") != null)
  156. contact.Profile.Country = source.Element("countryname").Value;
  157. if (source.Element("countryname") != null)
  158. contact.Profile.Country = source.Element("countryname").Value;
  159. if (source.Element("birthday") != null &&
  160. !(String.IsNullOrEmpty(source.Element("birthday").Element("year").Value)) &&
  161. !(String.IsNullOrEmpty(source.Element("birthday").Element("month").Value)) &&
  162. !(String.IsNullOrEmpty(source.Element("birthday").Element("day").Value)))
  163. {
  164. contact.Person.DateOfBirth = new DateTime(
  165. Int32.Parse(source.Element("birthday").Element("year").Value),
  166. Int32.Parse(source.Element("birthday").Element("month").Value),
  167. Int32.Parse(source.Element("birthday").Element("day").Value)
  168. );
  169. }
  170. if (source.Element("profilepicture") != null)
  171. {
  172. string url = source.Element("profilepicture").Element("icon_extralarge").Element("src").Value;
  173. ChannelAvatar avatar = new ChannelAvatar();
  174. avatar.Url = url;
  175. avatar.ContentStream = WebContentStreamHelper.GetContentStream(avatar.Url);
  176. contact.Profile.ChannelAvatar = avatar;
  177. }
  178. return contact;
  179. }
  180. ChannelMessageHeader ParseHeader(XElement source)
  181. {
  182. ChannelMessageHeader header = new ChannelMessageHeader();
  183. header.Context = source.Element("title").Value;
  184. header.MessageNumber = source.Element("messageid").Value;
  185. header.MessageIdentifier = source.Element("messageid").Value;
  186. string sourceid = source.Element("userid").Value;
  187. string targetid = source.Element("target_userid").Value;
  188. var recipients =
  189. PerformRequest(
  190. String.Format("http://data.hyves-api.nl/?userid={0}&ha_responsefields=profilepicture,cityname,countryname&ha_method=users.get&ha_version=experimental&ha_format=xml&ha_fancylayout=true", String.Join(",", new[] { sourceid, targetid})));
  191. var from = ParseContact(recipients.Elements("user").First(u => u.Element("userid").Value == sourceid));
  192. var to = ParseContact(recipients.Elements("user").First(u => u.Element("userid").Value == targetid));
  193. header.From = new SourceAddress(from.Profile.ChannelProfileKey, from.Profile.ScreenName);
  194. header.To.Add(new SourceAddress(to.Profile.ChannelProfileKey, to.Profile.ScreenName));
  195. string bodyType = source.Element("format").Value;
  196. if (bodyType == "html")
  197. {
  198. // For some weird reason, hyves sometimes sends htmlBody and sometimes htmlbody (lowercase b)
  199. var elem = source.Element("htmlBody") ?? source.Element("htmlbody");
  200. header.Body = elem.Value;
  201. }
  202. else
  203. header.Body = source.Element("body").Value;
  204. header.DateReceived = Int64.Parse(source.Element("created").Value).ToUnixTime();
  205. return header;
  206. }
  207. internal static XElement PerformRequest(string requestUri)
  208. {
  209. var authorizedToken = ChannelContext.Current.ClientContext.GetSetting("/Channels/Hyves/AuthToken").ToString();
  210. var authorizedSecret = ChannelContext.Current.ClientContext.GetSetting("/Channels/Hyves/AuthSecret").ToString();
  211. return HyvesApiRequest.PerformRequest(new Uri(requestUri), authorizedToken, authorizedSecret);
  212. }
  213. public void Dispose()
  214. {
  215. }
  216. }
  217. }