Mini Kabibi Habibi
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Net
Imports System.Text
Imports System.Web
Imports System.Web.Script.Serialization
Imports System.Globalization
Public Class Tweet
Private privateTweetDate As DateTime
Public Property TweetDate() As DateTime
Get
Return privateTweetDate
End Get
Set(ByVal value As DateTime)
privateTweetDate = value
End Set
End Property
Public ReadOnly Property TimePassed() As String
Get
Dim time = DateTime.Now - TweetDate
If time.Days > 1 Then
Return time.Days & " days"
End If
If time.Days = 1 Then
Return time.Days & " day"
End If
If time.Hours > 1 Then
Return time.Hours & " hours"
End If
If time.Hours = 1 Then
Return time.Hours & " hour"
End If
If time.Minutes > 1 Then
Return time.Minutes & " minutes"
End If
If time.Hours = 1 Then
Return time.Minutes & " minute"
End If
If time.Seconds > 1 Then
Return time.Minutes & " seconds"
End If
If time.Seconds = 1 Then
Return time.Minutes & " second"
End If
Return String.Empty
End Get
End Property
Private privateText As String
Public Property Text() As String
Get
Return privateText
End Get
Set(ByVal value As String)
privateText = value
End Set
End Property
Private privateUserName As String
Public Property UserName() As String
Get
Return privateUserName
End Get
Set(ByVal value As String)
privateUserName = value
End Set
End Property
Private privateUserImageUrl As String
Public Property UserImageUrl() As String
Get
Return privateUserImageUrl
End Get
Set(ByVal value As String)
privateUserImageUrl = value
End Set
End Property
End Class
Public NotInheritable Class TweetProviderMock
Private Shared simplifiedJSONResponce As String = "" & ControlChars.CrLf & " {" & ControlChars.CrLf & " ""query"":""""," & ControlChars.CrLf & " ""results"":[ {" & ControlChars.CrLf & " ""created_at"":""Mon, 21 May 2012 05:18:26 +0000""," & ControlChars.CrLf & " ""from_user"":""Alex Skorkin""," & ControlChars.CrLf & " ""profile_image_url"":""Widgets\/Images\/Twitter\/users\/AlexSkorkin.png""," & ControlChars.CrLf & " ""text"":""@devexpress Welcome to DevExpress Support Center 2.0""" & ControlChars.CrLf & " }, {" & ControlChars.CrLf & " ""created_at"":""Mon, 21 May 2012 05:18:26 +0000""," & ControlChars.CrLf & " ""from_user"":""Mehul Harry""," & ControlChars.CrLf & " ""profile_image_url"":""Widgets\/Images\/Twitter\/users\/MehulHarry.png""," & ControlChars.CrLf & " ""text"":""Vote for DevExpress in Code Project Reader's 2012 Choice Awards""" & ControlChars.CrLf & " }, {" & ControlChars.CrLf & " ""created_at"":""Mon, 21 May 2012 05:18:26 +0000""," & ControlChars.CrLf & " ""from_user"":""DevExpress""," & ControlChars.CrLf & " ""profile_image_url"":""Widgets\/Images\/Twitter\/users\/DevExpress.png""," & ControlChars.CrLf & " ""text"":""Consolidating Duplicate Code in Visual Studio – Easy with CodeRush""" & ControlChars.CrLf & " }, {" & ControlChars.CrLf & " ""created_at"":""Mon, 21 May 2012 05:18:26 +0000""," & ControlChars.CrLf & " ""from_user"":""Azret Botash""," & ControlChars.CrLf & " ""profile_image_url"":""Widgets\/Images\/Twitter\/users\/AzretBotash.png""," & ControlChars.CrLf & " ""text"":""Building iOS Web Apps with ASP.NET http://dxpr.es/wR1Hej """ & ControlChars.CrLf & " }, {" & ControlChars.CrLf & " ""created_at"":""Mon, 21 May 2012 05:18:26 +0000""," & ControlChars.CrLf & " ""from_user"":""Dave Mendlen""," & ControlChars.CrLf & " ""profile_image_url"":""Widgets\/Images\/Twitter\/users\/DaveMendlen.png""," & ControlChars.CrLf & " ""text"":""DevExpress tools upgrade focuses on touch development.""" & ControlChars.CrLf & " }]," & ControlChars.CrLf & " ""results_per_page"":6," & ControlChars.CrLf & " ""since_id"":0," & ControlChars.CrLf & " ""since_id_str"":""0""" & ControlChars.CrLf & " }"
Private Sub New()
End Sub
Public Shared Function GetTweets() As IEnumerable(Of Tweet)
Return TwitterUtils.ConvertTimeline(TwitterUtils.ParseJSON(simplifiedJSONResponce))
End Function
End Class
Public NotInheritable Class TweetProvider
Private Shared requestNear As String = "http://search.twitter.com/search.json?q={0}&rpp=3&geocode={1},{2},1mi&include_entities=true&with_twitter_user_id=true&result_type=mixed"
Private Sub New()
End Sub
Public Shared Function GetTweets(ByVal latitude As String, ByVal longitude As String) As IEnumerable(Of Tweet)
Return TwitterUtils.ConvertTimeline(TwitterUtils.MakeApiCall(String.Format(requestNear, "", latitude, longitude)))
End Function
End Class
Public NotInheritable Class TwitterUtils
Private Sub New()
End Sub
Public Shared Function MakeApiCall(ByVal url As String) As Object
Dim req = HttpWebRequest.Create(url)
Using stream = req.GetResponse().GetResponseStream()
Using reader = New StreamReader(stream, Encoding.UTF8)
Dim jsonResponce As String = reader.ReadToEnd()
Return ParseJSON(jsonResponce)
End Using
End Using
End Function
Public Shared Function ParseJSON(ByVal json As String) As Object
Return New JavaScriptSerializer().DeserializeObject(json)
End Function
Public Shared Function ConvertTimeline(ByVal raw As Object) As IEnumerable(Of Tweet)
Dim list = New List(Of Tweet)()
Try
Dim results = TryCast((TryCast(raw, Dictionary(Of String, Object)))("results"), IEnumerable)
For Each tweet In results
Dim tuplet = TryCast(tweet, Dictionary(Of String, Object))
list.Add(New Tweet With {.TweetDate = ParseDate(Convert.ToString(tuplet("created_at"))), .Text = Convert.ToString(tuplet("text")), .UserName = Convert.ToString(tuplet("from_user")), .UserImageUrl = Convert.ToString(tuplet("profile_image_url"))})
If list.Count >= 6 Then
Exit For
End If
Next tweet
Catch
End Try
Return list
End Function
Public Shared Function ParseDate(ByVal raw As String) As DateTime
Return DateTime.ParseExact(raw, "ddd, dd MMM yyyy HH:mm:ss zzz", New CultureInfo("en-US"))
End Function
End Class