Guest User

Untitled

a guest
May 24th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.55 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Std.Tweak;
  6.  
  7. namespace Mintw
  8. {
  9. /// <summary>
  10. /// Twitterへのアクセサ
  11. /// </summary>
  12. public class Access
  13. {
  14. //OAuth APIアクセスクラス
  15. public MintwOAuth api = new MintwOAuth();
  16.  
  17. //Mentionの受信カウンタ
  18. public int MentionCnt = 0;
  19.  
  20. //DMの受信カウンタ
  21. public int DmCnt = 0;
  22.  
  23. /// <summary>
  24. /// アクセサの初期化
  25. /// </summary>
  26. public void Init()
  27. {
  28. Kernel.MinitTimer = new System.Threading.Timer(TimerCallback, null, 0, 1000 * 60);
  29. }
  30.  
  31. /// <summary>
  32. /// 一分ごとに呼ばれるタイマーのコールバック
  33. /// </summary>
  34. public void TimerCallback(object o)
  35. {
  36. AccessMain(false);
  37. }
  38.  
  39. /// <summary>
  40. /// Twitterへアクセス
  41. /// </summary>
  42. /// <remarks>
  43. /// 1分ごとに呼ばれることを想定。
  44. /// </remarks>
  45. /// <param name="enforced">必ずチェックをするか(falseならカウンタ回数が規定値以上の場合にチェック)</param>
  46. public void AccessMain(bool enforced)
  47. {
  48. //カウンタ更新
  49. MentionCnt++;
  50. DmCnt++;
  51.  
  52. //新着ステータスのリスト
  53. List<TwitterStatusBase> received = new List<TwitterStatusBase>();
  54.  
  55. //DMが来たかのフラグ
  56. bool DMreceived = false;
  57. if (enforced || MentionCnt >= Kernel.Config.MentionInverval)
  58. {
  59. //カウンタ初期化
  60. MentionCnt = 0;
  61. //Mentionsのチェック
  62. var nr = CheckMentions();
  63. if (nr != null)
  64. received.AddRange(nr);
  65. }
  66. if (enforced || DmCnt >= Kernel.Config.DMInterval)
  67. {
  68. //カウンタ初期化
  69. DmCnt = 0;
  70. //DMのチェック
  71. var nr = CheckDms();
  72. if (nr != null)
  73. {
  74. received.AddRange(nr);
  75. DMreceived = true;
  76. }
  77. }
  78. if (received.Count > 0 && OnReceivedNew != null)
  79. {
  80. //戻り値生成 with LINQ
  81. OnReceivedNew.Invoke(
  82. from s in received
  83. orderby s.CreatedAt
  84. select s,
  85. DMreceived);
  86. }
  87. }
  88.  
  89. /// <summary>
  90. /// 受信時にExceptionが投げられました
  91. /// </summary>
  92. public event Action<Exception> OnThrownException;
  93.  
  94. /// <summary>
  95. /// 新着ステータスがあります(boolがtrueならDMを含んでいます)
  96. /// </summary>
  97. public event Action<IEnumerable<TwitterStatusBase>, bool> OnReceivedNew;
  98.  
  99. /// <summary>
  100. /// 新着Mentionsを列挙
  101. /// </summary>
  102. /// <returns>ステータスの列挙 もしくは NULL</returns>
  103. private IEnumerable<TwitterStatusBase> CheckMentions()
  104. {
  105. //アクセス情報更新
  106. UpdateAccessInformations();
  107. try
  108. {
  109. //受信とソート
  110. var mentions = from s in api.GetMentions()
  111. orderby s.CreatedAt descending
  112. select (TwitterStatusBase)s;
  113. if (mentions != null)
  114. //フィルタして返す
  115. return FilterReceivedStatuses(mentions, ref Kernel.prevRecvMentionId);
  116. }
  117. catch (Exception e)
  118. {
  119. //エラーの通知とNULL返し
  120. if (OnThrownException != null)
  121. OnThrownException.Invoke(e);
  122. }
  123. //受信がNULLか、エラーが発生している
  124. return null;
  125. }
  126.  
  127. /// <summary>
  128. /// 新着DMを列挙
  129. /// </summary>
  130. /// <returns>ステータスの列挙 もしくは NULL</returns>
  131. private IEnumerable<TwitterStatusBase> CheckDms()
  132. {
  133. //アクセス情報更新
  134. UpdateAccessInformations();
  135. try
  136. {
  137. //受信とソート
  138. var dms = from s in api.GetDirectMessages()
  139. orderby s.CreatedAt descending
  140. select (TwitterStatusBase)s;
  141. if (dms != null)
  142. //フィルタして返す
  143. return FilterReceivedStatuses(dms, ref Kernel.prevRecvDmId);
  144. }
  145. catch (Exception e)
  146. {
  147. //エラー通知
  148. if (OnThrownException != null)
  149. OnThrownException.Invoke(e);
  150. }
  151. //受信がNULLか、エラーが発生している
  152. return null;
  153. }
  154.  
  155. /// <summary>
  156. /// ステータスをフィルタ
  157. /// </summary>
  158. /// <param name="received">受信したステータスの列挙</param>
  159. /// <param name="prevReceivedId">IDの列挙</param>
  160. /// <returns>新着ステータスの列挙 もしくは NULL</returns>
  161. private IEnumerable<TwitterStatusBase> FilterReceivedStatuses(IEnumerable<TwitterStatusBase> received, ref long prevReceivedId)
  162. {
  163. if (prevReceivedId == 0)
  164. {
  165. //旧IDが無い→新着?
  166. foreach (var recv in received)
  167. {
  168. prevReceivedId = recv.Id;
  169. break;
  170. }
  171. }
  172. else
  173. {
  174. //前回の最新IDを代入
  175. long firstId = prevReceivedId;
  176. foreach (var recv in received)
  177. {
  178. //最新IDを反映
  179. prevReceivedId = recv.Id;
  180. //そしてすぐ抜ける
  181. break;
  182. }
  183. //旧最新IDよりもIDが大きいステータスのみを抽出して列挙
  184. return from s in received
  185. where s.Id > firstId
  186. select s;
  187. }
  188. //列挙されるべきステータスは無い
  189. return null;
  190. }
  191.  
  192. /// <summary>
  193. /// アクセス情報の更新
  194. /// </summary>
  195. private void UpdateAccessInformations()
  196. {
  197. api.Secret = Kernel.Config.UserSecret;
  198. api.Token = Kernel.Config.UserToken;
  199. }
  200. }
  201. }
Add Comment
Please, Sign In to add comment