OSDN Git Service

FavoriteQueueを簡易実装
authorf_swallow <f_swallow@users.sourceforge.jp>
Fri, 9 Sep 2011 11:00:06 +0000 (20:00 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 18 Feb 2012 14:19:51 +0000 (23:19 +0900)
Tween/FavoriteQueue.vb [new file with mode: 0644]
Tween/Tween.vbproj
Tween/Twitter.vb

diff --git a/Tween/FavoriteQueue.vb b/Tween/FavoriteQueue.vb
new file mode 100644 (file)
index 0000000..27d50f9
--- /dev/null
@@ -0,0 +1,62 @@
+Imports System.Threading.Tasks
+Imports System.Net
+
+Public Class FavoriteQueue
+    Private Shared _instance As New FavoriteQueue
+    Public Shared ReadOnly Property GetInstance As FavoriteQueue
+        Get
+            Return _instance
+        End Get
+    End Property
+
+    Public FavoriteCache As New List(Of Long)
+
+    Public Sub Add(ByVal stsId As Long)
+        If Not FavoriteCache.Contains(stsId) Then
+            FavoriteCache.Add(stsId)
+        End If
+    End Sub
+
+    Public Sub AddRange(ByVal stsIds As IEnumerable(Of Long))
+        FavoriteCache.AddRange(stsIds)
+    End Sub
+
+    Public Sub Remove(ByVal stsId As Long)
+        FavoriteCache.Remove(stsId)
+    End Sub
+
+    Public Sub FavoriteCacheAdd(ByVal statusId As Long, ByVal res As HttpStatusCode, Optional ByRef isMsg As Boolean = True)
+        'If Not SettingInfo.Instance.IsUseFavoriteQueue Then Exit Sub
+        Select Case res
+            Case HttpStatusCode.BadGateway, HttpStatusCode.BadRequest, HttpStatusCode.ServiceUnavailable, HttpStatusCode.InternalServerError, HttpStatusCode.RequestTimeout
+                isMsg = False
+                FavoriteCache.Add(statusId)
+        End Select
+    End Sub
+
+    Public Sub FavoriteCacheStart()
+        If Not FavoriteCache.Count = 0 Then
+            Dim _cacheList As New List(Of Long)(FavoriteCache)
+            AllClear()
+            Parallel.ForEach(Of Long)(_cacheList, New Action(Of Long)(Sub(stsId As Long)
+                                                                          TweenMain.GetInstance.TwitterInstance.PostFavAdd(stsId)
+                                                                      End Sub))
+        End If
+    End Sub
+
+    Public ReadOnly Property Count As Integer
+        Get
+            Return FavoriteCache.Count
+        End Get
+    End Property
+
+    Public Sub AllClear()
+        FavoriteCache.Clear()
+        FavoriteCache.TrimExcess()
+    End Sub
+
+    Public Function Contains(stsId As Long) As Boolean
+        Return FavoriteCache.Contains(stsId)
+    End Function
+
+End Class
index 532d24b..45368f1 100644 (file)
     <Compile Include="TweenAboutBox.vb">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Include="FavoriteQueue.vb" />
     <Compile Include="Twitter.vb" />
     <Compile Include="UserInfo.vb" />
     <Compile Include="WebBrowserController.vb" />
index b310405..eda1087 100644 (file)
@@ -1094,13 +1094,16 @@ Public Class Twitter
 
         If Twitter.AccountState <> ACCOUNT_STATE.Valid Then Return ""
 
+        If FavoriteQueue.GetInstance.Contains(id) Then FavoriteQueue.GetInstance.Remove(id)
+
         Google.GASender.GetInstance().TrackEventWithCategory("post", "favorites", Me.UserId)
         Dim res As HttpStatusCode
         Dim content As String = ""
         Try
             res = twCon.CreateFavorites(id, content)
         Catch ex As Exception
-            Return "Err:" + ex.Message + "(" + GetCurrentMethod.Name + ")"
+            FavoriteQueue.GetInstance.Add(id)
+            Return "Err:->FavoriteQueue:" + ex.Message + "(" + GetCurrentMethod.Name + ")"
         End Try
 
         Select Case res
@@ -1115,8 +1118,15 @@ Public Class Twitter
                 If String.IsNullOrEmpty(errMsg) Then
                     Return "Err:Forbidden(" + GetCurrentMethod.Name + ")"
                 Else
+                    If errMsg.Contains("It's great that you like so many updates") Then
+                        FavoriteQueue.GetInstance.Add(id)
+                        Return "Err:->FavoriteQueue:" + errMsg
+                    End If
                     Return "Err:" + errMsg
                 End If
+            Case HttpStatusCode.BadGateway, HttpStatusCode.ServiceUnavailable, HttpStatusCode.InternalServerError, HttpStatusCode.RequestTimeout
+                FavoriteQueue.GetInstance.Add(id)
+                Return "Err:->FavoriteQueue:" + res.ToString + "(" + GetCurrentMethod.Name + ")"
             Case Else
                 Return "Err:" + res.ToString + "(" + GetCurrentMethod.Name + ")"
         End Select
@@ -1165,6 +1175,11 @@ Public Class Twitter
 
         If Twitter.AccountState <> ACCOUNT_STATE.Valid Then Return ""
 
+        If FavoriteQueue.GetInstance.Contains(id) Then
+            FavoriteQueue.GetInstance.Remove(id)
+            Return ""
+        End If
+
         Google.GASender.GetInstance().TrackEventWithCategory("post", "destroy_favorites", Me.UserId)
         Dim res As HttpStatusCode
         Dim content As String = ""