From 3ca3fc924e2124c2fa7c8e17a3c3f3ff5ed63e30 Mon Sep 17 00:00:00 2001 From: peppertree Date: Wed, 12 Feb 2014 13:49:16 +0100 Subject: [PATCH] Initial Commit --- App_LocalResources/Settings.ascx.resx | 201 ++++++++++ App_LocalResources/View.ascx.resx | 138 +++++++ BuildScripts/MSBuild.Community.Tasks.Targets | 101 +++++ BuildScripts/ModulePackage.targets | 125 ++++++ Components/Entities/FeedController.vb | 258 ++++++++++++ Components/Entities/RenderedPost.vb | 127 ++++++ Components/Shared/Helpers.vb | 81 ++++ Components/Templates/TemplateProcessor.vb | 376 ++++++++++++++++++ Components/TwitterPost/Hashtag.vb | 24 ++ Components/TwitterPost/Media.vb | 24 ++ Components/TwitterPost/PostEntities.vb | 43 ++ Components/TwitterPost/TwitterPost.vb | 70 ++++ Components/TwitterPost/TwitterPosts.vb | 14 + Components/TwitterPost/TwitterUser.vb | 47 +++ Components/TwitterPost/Url.vb | 24 ++ Components/TwitterPost/User_Mention.vb | 34 ++ Data/DataProvider.vb | 53 +++ Documentation/Documentation.css | 82 ++++ Documentation/Documentation.html | 75 ++++ License.txt | 21 + My Project/AssemblyInfo.vb | 34 ++ ReleaseNotes.txt | 14 + Resources.zip | Bin 0 -> 45358 bytes Services/ClientFeedController.vb | 84 ++++ Services/RouteMapper.vb | 16 + Settings.ascx | 62 +++ Settings.ascx.designer.vb | 195 +++++++++ Settings.ascx.vb | 110 +++++ Templates/DarkBackground/Footer.htm | 4 + Templates/DarkBackground/Header.htm | 1 + Templates/DarkBackground/Item.htm | 16 + Templates/DarkBackground/ItemAlternate.htm | 16 + Templates/DarkBackground/images/twitter.png | Bin 0 -> 15327 bytes Templates/DarkBackground/template.css | 18 + Templates/Default/Footer.htm | 4 + Templates/Default/Header.htm | 1 + Templates/Default/Item.htm | 16 + Templates/Default/ItemAlternate.htm | 16 + Templates/Default/images/twitter.png | Bin 0 -> 15327 bytes Templates/Default/template.css | 18 + TwitterFeed.dnn | 76 ++++ TwitterFeed.sln | 22 + TwitterFeed.vbproj | 211 ++++++++++ View.ascx | 15 + View.ascx.designer.vb | 51 +++ View.ascx.vb | 220 ++++++++++ images/moduleicon.png | Bin 0 -> 4414 bytes images/twitter.png | Bin 0 -> 15327 bytes .../Connect.TwitterFeed_00.00.01_Install.zip | Bin 0 -> 35720 bytes .../Connect.TwitterFeed_00.00.01_Source.zip | Bin 0 -> 57506 bytes js/TwitterFeed.js | 22 + module.css | 0 52 files changed, 3160 insertions(+) create mode 100644 App_LocalResources/Settings.ascx.resx create mode 100644 App_LocalResources/View.ascx.resx create mode 100644 BuildScripts/MSBuild.Community.Tasks.Targets create mode 100644 BuildScripts/ModulePackage.targets create mode 100644 Components/Entities/FeedController.vb create mode 100644 Components/Entities/RenderedPost.vb create mode 100644 Components/Shared/Helpers.vb create mode 100644 Components/Templates/TemplateProcessor.vb create mode 100644 Components/TwitterPost/Hashtag.vb create mode 100644 Components/TwitterPost/Media.vb create mode 100644 Components/TwitterPost/PostEntities.vb create mode 100644 Components/TwitterPost/TwitterPost.vb create mode 100644 Components/TwitterPost/TwitterPosts.vb create mode 100644 Components/TwitterPost/TwitterUser.vb create mode 100644 Components/TwitterPost/Url.vb create mode 100644 Components/TwitterPost/User_Mention.vb create mode 100644 Data/DataProvider.vb create mode 100644 Documentation/Documentation.css create mode 100644 Documentation/Documentation.html create mode 100644 License.txt create mode 100644 My Project/AssemblyInfo.vb create mode 100644 ReleaseNotes.txt create mode 100644 Resources.zip create mode 100644 Services/ClientFeedController.vb create mode 100644 Services/RouteMapper.vb create mode 100644 Settings.ascx create mode 100644 Settings.ascx.designer.vb create mode 100644 Settings.ascx.vb create mode 100644 Templates/DarkBackground/Footer.htm create mode 100644 Templates/DarkBackground/Header.htm create mode 100644 Templates/DarkBackground/Item.htm create mode 100644 Templates/DarkBackground/ItemAlternate.htm create mode 100644 Templates/DarkBackground/images/twitter.png create mode 100644 Templates/DarkBackground/template.css create mode 100644 Templates/Default/Footer.htm create mode 100644 Templates/Default/Header.htm create mode 100644 Templates/Default/Item.htm create mode 100644 Templates/Default/ItemAlternate.htm create mode 100644 Templates/Default/images/twitter.png create mode 100644 Templates/Default/template.css create mode 100644 TwitterFeed.dnn create mode 100644 TwitterFeed.sln create mode 100644 TwitterFeed.vbproj create mode 100644 View.ascx create mode 100644 View.ascx.designer.vb create mode 100644 View.ascx.vb create mode 100644 images/moduleicon.png create mode 100644 images/twitter.png create mode 100644 install/Connect.TwitterFeed_00.00.01_Install.zip create mode 100644 install/Connect.TwitterFeed_00.00.01_Source.zip create mode 100644 js/TwitterFeed.js create mode 100644 module.css diff --git a/App_LocalResources/Settings.ascx.resx b/App_LocalResources/Settings.ascx.resx new file mode 100644 index 0000000..975aee3 --- /dev/null +++ b/App_LocalResources/Settings.ascx.resx @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Authentication Settings + + + TwitterFeed Settings + + + Custom Search + + + Display Settings + + + Enter your consumer key from the Twitter API + + + Consumer Key: + + + Enter your consumer secret from the Twitter API + + + Consumer Secret: + + + Select wether to show a user timeline or a custom search + + + Displaymode: + + + Enter a username or a search string, depending on what you selected in Displaymode. You may ommit @ or # + + + Search For: + + + Select a display template. Templates may be found in /Desktopmodules/Connect/TwitterFeed/Templates + + + Template + + + Enter your token key from the Twitter API + + + Token Key: + + + Enter your token secret from the Twitter API + + + Token Secret: + + + User Timeline + + + Select how many posts to retrieve + + + Post Count: + + + Select how often the module should refresh its data (value is in seconds) + + + Interval: + + + Client Side + + + Select wether to render server- or clientside. Auto-refresh is only supported in client side mode. + + + Rendering Mode: + + + Server Side + + \ No newline at end of file diff --git a/App_LocalResources/View.ascx.resx b/App_LocalResources/View.ascx.resx new file mode 100644 index 0000000..28280cc --- /dev/null +++ b/App_LocalResources/View.ascx.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Your settings are incomplete. Please got to <strong><i>Module Settings</i> &raquo; <i>TwitterFeed Settings</i></strong> and set up the module correctly. + + + More on Twitter.com + + + , {0} minutes ago + + + at {0} + + + today + + + yesterday + + \ No newline at end of file diff --git a/BuildScripts/MSBuild.Community.Tasks.Targets b/BuildScripts/MSBuild.Community.Tasks.Targets new file mode 100644 index 0000000..c1dddf2 --- /dev/null +++ b/BuildScripts/MSBuild.Community.Tasks.Targets @@ -0,0 +1,101 @@ + + + + $(MSBuildProjectDirectory)\BuildScripts + $(MSBuildProjectDirectory)\..\..\..\bin + $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BuildScripts/ModulePackage.targets b/BuildScripts/ModulePackage.targets new file mode 100644 index 0000000..a82795e --- /dev/null +++ b/BuildScripts/ModulePackage.targets @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Components/Entities/FeedController.vb b/Components/Entities/FeedController.vb new file mode 100644 index 0000000..ee2056d --- /dev/null +++ b/Components/Entities/FeedController.vb @@ -0,0 +1,258 @@ +#Region "copyright" + +' bitboxx - http://www.bitboxx.net +' Copyright (c) 2014 +' by bitboxx solutions Torsten Weggen +' +' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +' documentation files (the "Software"), to deal in the Software without restriction, including without limitation +' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +' to permit persons to whom the Software is furnished to do so, subject to the following conditions: +' +' The above copyright notice and this permission notice shall be included in all copies or substantial portions +' of the Software. +' +' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +' TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +' DEALINGS IN THE SOFTWARE. + +#End Region + + +Imports System.Collections.Generic +Imports System.Linq +Imports System.Security.Cryptography +Imports System.Text +Imports System.Web +Imports System.Web.Script.Serialization +Imports System.Xml.Linq +Imports System.Net +Imports System.IO + + +Public Class FeedController + + Private m_TokenKey As String + Private m_TokenSecret As String + Private m_ConsumerKey As String + Private m_ConsumerSecret As String + + Public Property TokenKey() As String + Get + Return m_TokenKey + End Get + Set(value As String) + m_TokenKey = value + End Set + End Property + + Public Property TokenSecret() As String + Get + Return m_TokenSecret + End Get + Set(value As String) + m_TokenSecret = value + End Set + End Property + + Public Property ConsumerKey() As String + Get + Return m_ConsumerKey + End Get + Set(value As String) + m_ConsumerKey = value + End Set + End Property + + Public Property ConsumerSecret() As String + Get + Return m_ConsumerSecret + End Get + Set(value As String) + m_ConsumerSecret = value + End Set + End Property + + Public Sub New(tokenKey As String, tokenSecret As String, consumerKey As String, consumerSecret As String) + Me.TokenKey = tokenKey + Me.TokenSecret = tokenSecret + Me.ConsumerKey = consumerKey + Me.ConsumerSecret = consumerSecret + End Sub + + Public Function GetUserTimeLine(twitterUsername As String, tweetsCount As Integer) As List(Of TwitterPost) + ' Other OAuth connection/authentication variables + Dim oAuthVersion As String = "1.0" + Dim oAuthSignatureMethod As String = "HMAC-SHA1" + Dim oAuthNonce As String = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString())) + Dim timeSpan As TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, _ + 0, DateTimeKind.Utc) + Dim oAuthTimestamp As String = Convert.ToInt64(timeSpan.TotalSeconds).ToString() + Dim resourceUrl As String = "https://api.twitter.com/1.1/statuses/user_timeline.json" + + ' Generate OAuth signature. Note that Twitter is very particular about the format of this string. Even reordering the variables + ' will cause authentication errors. + + Dim baseFormat = "count={7}&oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" & "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&screen_name={6}" + + Dim baseString = String.Format(baseFormat, ConsumerKey, oAuthNonce, oAuthSignatureMethod, oAuthTimestamp, TokenKey, _ + oAuthVersion, Uri.EscapeDataString(twitterUsername), Uri.EscapeDataString(tweetsCount.ToString())) + + baseString = String.Concat("GET&", Uri.EscapeDataString(resourceUrl), "&", Uri.EscapeDataString(baseString)) + + ' Generate an OAuth signature using the baseString + Dim compositeKey = String.Concat(Uri.EscapeDataString(ConsumerSecret), "&", Uri.EscapeDataString(TokenSecret)) + Dim oAuthSignature As String + Using hasher As New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)) + oAuthSignature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString))) + End Using + + ' Now build the Authentication header. Again, Twitter is very particular about the format. Do not reorder variables. + Dim headerFormat = "OAuth oauth_nonce=""{0}"", oauth_signature_method=""{1}"", " & "oauth_timestamp=""{2}"", oauth_consumer_key=""{3}"", " & "oauth_token=""{4}"", oauth_signature=""{5}"", " & "oauth_version=""{6}""" + + Dim authHeader = String.Format(headerFormat, Uri.EscapeDataString(oAuthNonce), Uri.EscapeDataString(oAuthSignatureMethod), Uri.EscapeDataString(oAuthTimestamp), Uri.EscapeDataString(ConsumerKey), Uri.EscapeDataString(TokenKey), _ + Uri.EscapeDataString(oAuthSignature), Uri.EscapeDataString(oAuthVersion)) + + ' Now build the actual request + + ServicePointManager.Expect100Continue = False + Dim postBody = String.Format("screen_name={0}&count={1}", Uri.EscapeDataString(twitterUsername), Uri.EscapeDataString(tweetsCount.ToString())) + resourceUrl += "?" & postBody + Dim request As HttpWebRequest = DirectCast(WebRequest.Create(resourceUrl), HttpWebRequest) + request.Headers.Add("Authorization", authHeader) + request.Method = "GET" + request.ContentType = "application/x-www-form-urlencoded" + + ' Retrieve the response data and deserialize the JSON data to a list of Tweet objects + Dim response As WebResponse = request.GetResponse() + Dim responseData As String = New StreamReader(response.GetResponseStream()).ReadToEnd() + Dim userTweets As List(Of TwitterPost) = New JavaScriptSerializer().Deserialize(Of List(Of TwitterPost))(responseData) + + Return userTweets + 'Return TweetsToNews(userTweets) + + End Function + + Public Function SearchTweets(searchTerm As String, tweetsCount As Integer) As List(Of TwitterPost) + 'Dim TokenKey As String = "55684465-gvmJ81DMpzs7QxjY4BlQM2GzRWE9sUZIVTWMrX9nN" + 'Dim TokenSecret As String = "nO07e9Vyj4MVJtAYTmYaW2RrEtuJSineAIesWtTTXA" + 'Dim ConsumerKey As String = "HEc2tiosBZ0U62SLmsYaOA" + 'Dim ConsumerSecret As String = "i3OGf4Rm3bA5MSV55X2froEjo4TCJtA49msBJ1dW9Fc" + + ' Other OAuth connection/authentication variables + Dim oAuthVersion As String = "1.0" + Dim oAuthSignatureMethod As String = "HMAC-SHA1" + Dim oAuthNonce As String = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString())) + Dim timeSpan As TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, _ + 0, DateTimeKind.Utc) + Dim oAuthTimestamp As String = Convert.ToInt64(timeSpan.TotalSeconds).ToString() + Dim resourceUrl As String = "https://api.twitter.com/1.1/search/tweets.json" + + ' Generate OAuth signature. Note that Twitter is very particular about the format of this string. Even reordering the variables + ' will cause authentication errors. + + Dim baseFormat = "count={7}&oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" & "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&q={6}" + + Dim baseString = String.Format(baseFormat, ConsumerKey, oAuthNonce, oAuthSignatureMethod, oAuthTimestamp, TokenKey, _ + oAuthVersion, Uri.EscapeDataString(searchTerm), Uri.EscapeDataString(tweetsCount.ToString())) + + baseString = String.Concat("GET&", Uri.EscapeDataString(resourceUrl), "&", Uri.EscapeDataString(baseString)) + + ' Generate an OAuth signature using the baseString + Dim compositeKey = String.Concat(Uri.EscapeDataString(ConsumerSecret), "&", Uri.EscapeDataString(TokenSecret)) + Dim oAuthSignature As String + Using hasher As New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)) + oAuthSignature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString))) + End Using + + ' Now build the Authentication header. Again, Twitter is very particular about the format. Do not reorder variables. + Dim headerFormat = "OAuth oauth_nonce=""{0}"", oauth_signature_method=""{1}"", " & "oauth_timestamp=""{2}"", oauth_consumer_key=""{3}"", " & "oauth_token=""{4}"", oauth_signature=""{5}"", " & "oauth_version=""{6}""" + + Dim authHeader = String.Format(headerFormat, Uri.EscapeDataString(oAuthNonce), Uri.EscapeDataString(oAuthSignatureMethod), Uri.EscapeDataString(oAuthTimestamp), Uri.EscapeDataString(ConsumerKey), Uri.EscapeDataString(TokenKey), _ + Uri.EscapeDataString(oAuthSignature), Uri.EscapeDataString(oAuthVersion)) + + ' Now build the actual request + + ServicePointManager.Expect100Continue = False + Dim postBody = String.Format("q={0}&count={1}", Uri.EscapeDataString(searchTerm), Uri.EscapeDataString(tweetsCount.ToString())) + resourceUrl += "?" & postBody + Dim request As HttpWebRequest = DirectCast(WebRequest.Create(resourceUrl), HttpWebRequest) + request.Headers.Add("Authorization", authHeader) + request.Method = "GET" + request.ContentType = "application/x-www-form-urlencoded" + + ' Retrieve the response data and deserialize the JSON data to a list of Tweet objects + Dim response As WebResponse = request.GetResponse() + Dim responseData As String = New StreamReader(response.GetResponseStream()).ReadToEnd() + 'Dim userTweets As TwitterPosts = New JavaScriptSerializer().Deserialize(Of TwitterPosts)(responseData) + Dim posts As TwitterPosts = New JavaScriptSerializer().Deserialize(Of TwitterPosts)(responseData) + Return posts.statuses + 'Return TweetsToNews(userTweets.posts) + + End Function + + Private Function TweetsToNews(tweets As List(Of TwitterPost)) As List(Of RenderedPost) + + Dim Posts As New List(Of RenderedPost)() + + For Each userTweet As TwitterPost In tweets + Dim tweet As New RenderedPost() + tweet.AuthorFullName = userTweet.user.name + tweet.AuthorScreenName = userTweet.user.screen_name + tweet.AuthorUrl = userTweet.user.url + tweet.AuthorUrl = userTweet.user.url + tweet.AuthorProfilePic = userTweet.user.profile_image_url + + tweet.GUID = userTweet.id_str + tweet.Image = userTweet.user.profile_image_url + tweet.Link = "https://twitter.com/" & userTweet.user.screen_name + tweet.Pubdate = Helpers.ParseDateTime(userTweet.created_at) + tweet.Content = HttpUtility.HtmlDecode(userTweet.text) + tweet.Title = HttpUtility.HtmlDecode(userTweet.text) + + Dim pos As Integer = tweet.Title.IndexOf("http://t.co") + If pos > -1 Then + Dim start As String = tweet.Title.Substring(0, pos - 1) + Dim rest As String = tweet.Title.Substring(pos) + Dim posEnde As Integer = rest.IndexOf(" ") + + If posEnde > -1 Then + tweet.Link = rest.Substring(0, posEnde - 1) + rest = rest.Substring(posEnde) + tweet.Content = ((start & " ") + tweet.Link & " " & rest + tweet.Title = (start & " ") + tweet.Link & rest + Else + tweet.Link = rest + tweet.Content = ((start & " ") + tweet.Link & " " + tweet.Title = (start & " ") + tweet.Link + End If + End If + pos = tweet.Title.IndexOf("https://t.co") + If pos > -1 Then + Dim start As String = tweet.Title.Substring(0, pos - 1) + Dim rest As String = tweet.Title.Substring(pos) + Dim posEnde As Integer = rest.IndexOf(" ") + + If posEnde > -1 Then + tweet.Link = rest.Substring(0, posEnde - 1) + rest = rest.Substring(posEnde) + tweet.Content = ((start & " ") + tweet.Link & " " & rest + tweet.Title = (start & " ") + tweet.Link & rest + Else + tweet.Link = rest + tweet.Content = ((start & " ") + tweet.Link & " " + tweet.Title = (start & " ") + tweet.Link + End If + End If + Posts.Add(tweet) + Next + + Return (From l In Posts Where l.Content <> [String].Empty Order By l.Pubdate Descending).ToList() + + End Function + + +End Class + diff --git a/Components/Entities/RenderedPost.vb b/Components/Entities/RenderedPost.vb new file mode 100644 index 0000000..90b0d5b --- /dev/null +++ b/Components/Entities/RenderedPost.vb @@ -0,0 +1,127 @@ +#Region "copyright" + + +#End Region + + +Imports System.Data +Imports System.Globalization +Imports System.Text.RegularExpressions +Imports DotNetNuke.Common.Utilities +Imports DotNetNuke.Entities.Modules +Imports DotNetNuke.Entities.Portals +Imports DotNetNuke.Entities.Users +Imports DotNetNuke.Services.Tokens + + + _ +Public Class RenderedPost + + Private m_AuthorScreenName As String + Private m_AuthorFullname As String + Private m_AuthorUrl As String + Private m_AuthorProfilePic As String + Private m_GUID As String + Private m_Image As String + Private m_Link As String + Private m_Pubdate As DateTime + Private m_Content As String + Private m_Title As String + + Public Property AuthorScreenName() As String + Get + Return m_AuthorScreenName + End Get + Set(value As String) + m_AuthorScreenName = value + End Set + End Property + + Public Property AuthorFullName() As String + Get + Return m_AuthorFullname + End Get + Set(value As String) + m_AuthorFullname = value + End Set + End Property + + Public Property AuthorUrl() As String + Get + Return m_AuthorUrl + End Get + Set(value As String) + m_AuthorUrl = value + End Set + End Property + + Public Property AuthorProfilePic() As String + Get + Return m_AuthorProfilePic + End Get + Set(value As String) + m_AuthorProfilePic = value + End Set + End Property + + Public Property GUID() As String + Get + Return m_GUID + End Get + Set(value As String) + m_GUID = value + End Set + End Property + + Public Property Image() As String + Get + Return m_Image + End Get + Set(value As String) + m_Image = value + End Set + End Property + + Public Property Link() As String + Get + Return m_Link + End Get + Set(value As String) + m_Link = value + End Set + End Property + + Public Property Pubdate() As DateTime + Get + Return m_Pubdate + End Get + Set(value As DateTime) + m_Pubdate = value + End Set + End Property + + Public Property Content() As String + Get + Return m_Content + End Get + Set(value As String) + m_Content = value + End Set + End Property + + Public Property Title() As String + Get + Return m_Title + End Get + Set(value As String) + m_Title = value + End Set + End Property + + Public Sub New() + End Sub + +End Class + + + diff --git a/Components/Shared/Helpers.vb b/Components/Shared/Helpers.vb new file mode 100644 index 0000000..b96819b --- /dev/null +++ b/Components/Shared/Helpers.vb @@ -0,0 +1,81 @@ +Imports System.IO + +Public Class Helpers + + Public Shared Function ParseDateTime([date] As String) As DateTime + + + Try + + Dim format As String = "ddd MMM dd HH:mm:ss zzzz yyyy" + Dim dt As DateTime = DateTime.ParseExact([date], format, System.Globalization.CultureInfo.InvariantCulture) + Return dt + + Catch ex As Exception + + + Dim dayOfWeek As String = [date].Substring(0, 3).Trim() + Dim month As String = [date].Substring(4, 3).Trim() + Dim dayInMonth As String = [date].Substring(8, 2).Trim() + Dim time As String = [date].Substring(11, 9).Trim() + Dim offset As String = [date].Substring(20, 5).Trim() + Dim year As String = [date].Substring(25, 5).Trim() + Dim dateTime__1 As String = String.Format("{0}-{1}-{2} {3}", dayInMonth, month, year, time) + Dim ret As DateTime = DateTime.Parse(dateTime__1) + Return ret + + End Try + + End Function + + Public Shared Function GetTweetBodyAsRichText(ByVal objTweet As TwitterPost) As String + + Dim strHTML As String = objTweet.text + + If Not objTweet.entities Is Nothing Then + + If Not objTweet.entities.urls Is Nothing Then + For Each objUrl As url In objTweet.entities.urls + Dim urlstring As String = objUrl.url + Dim url As String = objUrl.url + strHTML = strHTML.Replace(urlstring, String.Format("{1}", url, urlstring)) + Next + End If + + If Not objTweet.entities.user_mentions Is Nothing Then + For Each objMention As user_mention In objTweet.entities.user_mentions + Dim usernamestring As String = "@" & objMention.screen_name + Dim userurl As String = "http://twitter.com/" & objMention.screen_name + strHTML = strHTML.Replace(usernamestring, String.Format("{1}", userurl, usernamestring)) + Next + End If + + If Not objTweet.entities.hashtags Is Nothing Then + For Each objHashtag As hashtag In objTweet.entities.hashtags + Dim hashtagstring As String = "#" & objHashtag.text + Dim hashtagurl As String = "http://twitter.com?q=" & objHashtag.text + strHTML = strHTML.Replace(hashtagstring, String.Format("{1}", hashtagurl, hashtagstring)) + Next + + End If + End If + + Return strHTML + + End Function + + Public Shared Function ReadTemplate(strTemplatePath As String) As String + + If File.Exists(strTemplatePath) Then + Dim sr As New StreamReader(strTemplatePath) + Dim strContent As String = sr.ReadToEnd + sr.Close() + sr.Dispose() + Return strContent + End If + + Return "" + + End Function + +End Class diff --git a/Components/Templates/TemplateProcessor.vb b/Components/Templates/TemplateProcessor.vb new file mode 100644 index 0000000..ef2f57b --- /dev/null +++ b/Components/Templates/TemplateProcessor.vb @@ -0,0 +1,376 @@ +Imports DotNetNuke.Services.Localization + +Public Class TemplateProcessor + + Private _TokenKey As String = "" + Private _TokenSecret As String = "" + Private _ConsumerKey As String = "" + Private _ConsumerSecret As String = "" + Private _Displaymode As String = "" + Private _Template As String = "" + Private _SearchFor As String = "" + Private _PostCount As String = "10" + Private _RefreshInterval As String = "30" + Private _settings As Hashtable + Private _LocalResourcefile As String = "~/Desktopmodules/Connect/TwitterFeed/App_LocalResources/View.ascx" + + Public Sub New(Settings As Hashtable) + _settings = Settings + LoadSettings() + End Sub + + Public Sub ProcessSurroundingTemplate(ByRef controls As System.Web.UI.ControlCollection, ByVal Template As String) + ProcessSurroundingTemplate(Nothing, controls, Template) + End Sub + + Public Sub ProcessSurroundingTemplate(ByRef strHtml As String, ByVal Template As String) + ProcessSurroundingTemplate(strHtml, Nothing, Template) + End Sub + + Private Sub ProcessSurroundingTemplate(ByRef strHtml As String, ByRef controls As System.Web.UI.ControlCollection, ByVal Template As String) + + Dim literal As New Literal + Dim delimStr As String = "[]" + Dim delimiter As Char() = delimStr.ToCharArray() + + Dim templateArray As String() + templateArray = Template.Split(delimiter) + + For iPtr As Integer = 0 To templateArray.Length - 1 Step 2 + + If Not controls Is Nothing Then + controls.Add(New LiteralControl(templateArray(iPtr).ToString())) + End If + + If Not strHtml Is Nothing Then + strHtml += templateArray(iPtr).ToString() + End If + + + If iPtr < templateArray.Length - 1 Then + Select Case templateArray(iPtr + 1) + + Case "TWITTERURL" + + Dim strUrl As String = "" + Select Case _Displaymode.ToLower + Case "u" + strUrl = "http://twitter.com/" & _SearchFor + Case "s" + strUrl = "http://twitter.com/search?q=" & _SearchFor + End Select + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = strUrl + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += strUrl + End If + + Case Else + + If (templateArray(iPtr + 1).ToUpper().StartsWith("RESX:")) Then + + Dim key As String = templateArray(iPtr + 1).Substring(5, templateArray(iPtr + 1).Length - 5) + Dim strText As String = Localization.GetString(key, _LocalResourcefile) + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = strText + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += strText + End If + + End If + + End Select + End If + Next + + End Sub + + Public Sub ProcessItemTemplate(ByRef strHtml As String, ByVal Template As String, ByVal objPost As TwitterPost) + ProcessItemTemplate(strHtml, Nothing, Template, objPost) + End Sub + + Public Sub ProcessItemTemplate(ByRef controls As System.Web.UI.ControlCollection, ByVal Template As String, ByVal objPost As TwitterPost) + ProcessItemTemplate(Nothing, controls, Template, objPost) + End Sub + + Private Sub ProcessItemTemplate(ByRef strHtml As String, ByRef controls As System.Web.UI.ControlCollection, ByVal Template As String, ByVal objPost As TwitterPost) + + Dim literal As New Literal + Dim delimStr As String = "[]" + Dim delimiter As Char() = delimStr.ToCharArray() + + Dim templateArray As String() + templateArray = Template.Split(delimiter) + + For iPtr As Integer = 0 To templateArray.Length - 1 Step 2 + + If Not controls Is Nothing Then + controls.Add(New LiteralControl(templateArray(iPtr).ToString())) + End If + + If Not strHtml Is Nothing Then + strHtml += templateArray(iPtr).ToString() + End If + + If iPtr < templateArray.Length - 1 Then + Select Case templateArray(iPtr + 1) + Case "CONTENT" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.text + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.text + End If + + Case "HTMLCONTENT" + + Dim strContent As String = Helpers.GetTweetBodyAsRichText(objPost) + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = strContent + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += strContent + End If + + + Case "SOURCE" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.source + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.source + End If + + Case "HASEMBEDDEDIMAGE" + If objPost.entities.media Is Nothing OrElse objPost.entities.media.Count = 0 Then + While (iPtr < templateArray.Length - 1) + If (templateArray(iPtr + 1) = "/HASEMBEDDEDIMAGE") Then + Exit While + End If + iPtr = iPtr + 1 + End While + End If + Case "EMBEDDEDIMAGEURL" + If Not objPost.entities.media Is Nothing Then + If objPost.entities.media.Count > 0 Then + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.entities.media(0).media_url + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.entities.media(0).media_url + End If + + + End If + End If + Case "HASEMBEDDELINK" + If objPost.entities.urls Is Nothing OrElse objPost.entities.urls.Count = 0 Then + While (iPtr < templateArray.Length - 1) + If (templateArray(iPtr + 1) = "/HASEMBEDDELINK") Then + Exit While + End If + iPtr = iPtr + 1 + End While + End If + Case "EMBEDDEDLINKURL" + If Not objPost.entities.urls Is Nothing Then + If objPost.entities.urls.Count > 0 Then + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.entities.urls(0).url + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.entities.urls(0).url + End If + + + End If + End If + Case "PUBLISHDATE" + + Dim Publishdate As DateTime = Helpers.ParseDateTime(objPost.created_at) + Dim strDate As String = Publishdate.ToShortDateString + + If Publishdate.Date = Date.Now.Date Then + strDate = Localization.GetString("Today", _LocalResourcefile) + End If + + If Publishdate.Date.AddDays(1) = Date.Now.Date Then + strDate = Localization.GetString("Yesterday", _LocalResourcefile) + End If + + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = strDate + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += strDate + End If + + + Case "PUBLISHTIME" + + Dim Publishdate As DateTime = Helpers.ParseDateTime(objPost.created_at) + Dim strTime As String = String.Format(Localization.GetString("Time", _LocalResourcefile), Publishdate.ToShortTimeString) + + If Publishdate.Date = Date.Now.Date Then + 'today + Dim diff As Integer = DateDiff(DateInterval.Minute, Publishdate, Date.Now) + If diff < 60 Then + 'within last hour + strTime = String.Format(Localization.GetString("MinutesAgo", _LocalResourcefile), diff.ToString) + End If + + End If + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = strTime + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += strTime + End If + + + Case "AUTHORSCREENNAME" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.user.screen_name + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.user.screen_name + End If + + + Case "AUTHORFULLNAME" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.user.name + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.user.name + End If + + Case "AUTHORURL" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.user.url + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.user.url + End If + + Case "AUTHORIMAGEURL" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.user.profile_image_url + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.user.profile_image_url + End If + + Case "AUTHORIMAGEURLBIGGER" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.user.profile_image_url.Replace("_normal", "_bigger") + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.user.profile_image_url.Replace("_normal", "_bigger") + End If + + Case "AUTHORIMAGEURLORIGINAL" + + If Not controls Is Nothing Then + Dim objLiteral As New Literal + objLiteral.Text = objPost.user.profile_image_url.Replace("_normal", "") + objLiteral.EnableViewState = False + controls.Add(objLiteral) + End If + + If Not strHtml Is Nothing Then + strHtml += objPost.user.profile_image_url.Replace("_normal", "") + End If + + End Select + End If + Next + + + End Sub + + Private Sub LoadSettings() + If (_settings.Contains("Twitter_SelectedTemplate")) Then _Template = _settings("Twitter_SelectedTemplate").ToString() + If (_settings.Contains("Twitter_DisplayMode")) Then _Displaymode = _settings("Twitter_DisplayMode").ToString() + If (_settings.Contains("Twitter_ConsumerKey")) Then _ConsumerKey = _settings("Twitter_ConsumerKey").ToString() + If (_settings.Contains("Twitter_ConsumerSecret")) Then _ConsumerSecret = _settings("Twitter_ConsumerSecret").ToString() + If (_settings.Contains("Twitter_TokenKey")) Then _TokenKey = _settings("Twitter_TokenKey").ToString() + If (_settings.Contains("Twitter_TokenSecret")) Then _TokenSecret = _settings("Twitter_TokenSecret").ToString() + If (_settings.Contains("Twitter_SearchFor")) Then _SearchFor = _settings("Twitter_SearchFor").ToString() + If (_settings.Contains("Twitter_PostCount")) Then _PostCount = _settings("Twitter_PostCount").ToString() + If (_settings.Contains("Twitter_RefreshInterval")) Then _RefreshInterval = _settings("Twitter_RefreshInterval").ToString() + End Sub + +End Class diff --git a/Components/TwitterPost/Hashtag.vb b/Components/TwitterPost/Hashtag.vb new file mode 100644 index 0000000..e233229 --- /dev/null +++ b/Components/TwitterPost/Hashtag.vb @@ -0,0 +1,24 @@ +Public Class hashtag + + Private m_text As String + Private m_indices As String() + + Public Property text() As String + Get + Return m_text + End Get + Set(value As String) + m_text = value + End Set + End Property + + Public Property indices() As String() + Get + Return m_indices + End Get + Set(value As String()) + m_indices = value + End Set + End Property + +End Class diff --git a/Components/TwitterPost/Media.vb b/Components/TwitterPost/Media.vb new file mode 100644 index 0000000..ac2b2a1 --- /dev/null +++ b/Components/TwitterPost/Media.vb @@ -0,0 +1,24 @@ +Public Class media + + Private m_media_url As String + Private m_indices As String() + + Public Property media_url() As String + Get + Return m_media_url + End Get + Set(value As String) + m_media_url = value + End Set + End Property + + Public Property indices() As String() + Get + Return m_indices + End Get + Set(value As String()) + m_indices = value + End Set + End Property + +End Class diff --git a/Components/TwitterPost/PostEntities.vb b/Components/TwitterPost/PostEntities.vb new file mode 100644 index 0000000..8450cf1 --- /dev/null +++ b/Components/TwitterPost/PostEntities.vb @@ -0,0 +1,43 @@ +Public Class PostEntities + + Private m_urls As List(Of Url) + Private m_media As List(Of media) + Private m_user_mentions As List(Of user_mention) + Private m_hashtags As List(Of hashtag) + + Public Property urls() As List(Of Url) + Get + Return m_urls + End Get + Set(value As List(Of Url)) + m_urls = value + End Set + End Property + + Public Property media() As List(Of Media) + Get + Return m_media + End Get + Set(value As List(Of Media)) + m_media = value + End Set + End Property + + Public Property hashtags() As List(Of hashtag) + Get + Return m_hashtags + End Get + Set(value As List(Of hashtag)) + m_hashtags = value + End Set + End Property + + Public Property user_mentions() As List(Of user_mention) + Get + Return m_user_mentions + End Get + Set(value As List(Of user_mention)) + m_user_mentions = value + End Set + End Property +End Class diff --git a/Components/TwitterPost/TwitterPost.vb b/Components/TwitterPost/TwitterPost.vb new file mode 100644 index 0000000..e2aaef2 --- /dev/null +++ b/Components/TwitterPost/TwitterPost.vb @@ -0,0 +1,70 @@ +Public Class TwitterPost + + Private m_created_at As String + Private m_id_str As String + Private m_text As String + Private m_source As String + Private m_user As TwitterUser + Private m_entities As PostEntities + + Public Sub New() + End Sub + + Public Property created_at() As String + Get + Return m_created_at + End Get + Set(value As String) + m_created_at = value + End Set + End Property + + Public Property id_str() As String + Get + Return m_id_str + End Get + Set(value As String) + m_id_str = value + End Set + End Property + + Public Property source() As String + Get + Return m_source + End Get + Set(value As String) + m_source = value + End Set + End Property + + Public Property text() As String + Get + Return m_text + End Get + Set(value As String) + m_text = value + End Set + End Property + + Public Property user() As TwitterUser + Get + Return m_user + End Get + Set(value As TwitterUser) + m_user = value + End Set + End Property + + Public Property entities() As PostEntities + Get + Return m_entities + End Get + Set(value As PostEntities) + m_entities = value + End Set + End Property + + + + +End Class diff --git a/Components/TwitterPost/TwitterPosts.vb b/Components/TwitterPost/TwitterPosts.vb new file mode 100644 index 0000000..46d4c34 --- /dev/null +++ b/Components/TwitterPost/TwitterPosts.vb @@ -0,0 +1,14 @@ +Public Class TwitterPosts + + Private m_posts As List(Of TwitterPost) + + Public Property statuses() As List(Of TwitterPost) + Get + Return m_posts + End Get + Set(value As List(Of TwitterPost)) + m_posts = value + End Set + End Property + +End Class diff --git a/Components/TwitterPost/TwitterUser.vb b/Components/TwitterPost/TwitterUser.vb new file mode 100644 index 0000000..4cf6061 --- /dev/null +++ b/Components/TwitterPost/TwitterUser.vb @@ -0,0 +1,47 @@ +Public Class TwitterUser + + Private m_screen_name As String + Private m_name As String + Private m_url As String + Private m_profile_image_url As String + + Public Sub New() + End Sub + + Public Property name() As String + Get + Return m_name + End Get + Set(value As String) + m_name = value + End Set + End Property + + Public Property screen_name() As String + Get + Return m_screen_name + End Get + Set(value As String) + m_screen_name = value + End Set + End Property + + Public Property profile_image_url() As String + Get + Return m_profile_image_url + End Get + Set(value As String) + m_profile_image_url = value + End Set + End Property + + Public Property url() As String + Get + Return m_url + End Get + Set(value As String) + m_url = value + End Set + End Property + +End Class diff --git a/Components/TwitterPost/Url.vb b/Components/TwitterPost/Url.vb new file mode 100644 index 0000000..e8a532f --- /dev/null +++ b/Components/TwitterPost/Url.vb @@ -0,0 +1,24 @@ +Public Class url + + Private m_url As String + Private m_indices As String() + + Public Property url() As String + Get + Return m_url + End Get + Set(value As String) + m_url = value + End Set + End Property + + Public Property indices() As String() + Get + Return m_indices + End Get + Set(value As String()) + m_indices = value + End Set + End Property + +End Class diff --git a/Components/TwitterPost/User_Mention.vb b/Components/TwitterPost/User_Mention.vb new file mode 100644 index 0000000..54565d7 --- /dev/null +++ b/Components/TwitterPost/User_Mention.vb @@ -0,0 +1,34 @@ +Public Class user_mention + + Private m_name As String + Private m_screen_name As String + Private m_indices As String() + + Public Property name() As String + Get + Return m_name + End Get + Set(value As String) + m_name = value + End Set + End Property + + Public Property screen_name() As String + Get + Return m_screen_name + End Get + Set(value As String) + m_screen_name = value + End Set + End Property + + Public Property indices() As String() + Get + Return m_indices + End Get + Set(value As String()) + m_indices = value + End Set + End Property + +End Class diff --git a/Data/DataProvider.vb b/Data/DataProvider.vb new file mode 100644 index 0000000..6fefd06 --- /dev/null +++ b/Data/DataProvider.vb @@ -0,0 +1,53 @@ +' Copyright (c) 2014 Christoc.com +' All rights reserved. +' +' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +' TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +' DEALINGS IN THE SOFTWARE. +' + +Imports DotNetNuke + +Namespace Data + + ''' + ''' An abstract class for the data access layer + ''' + ''' The abstract data provider provides the methods that a control data provider (sqldataprovider) + ''' must implement. You'll find two commented out examples in the Abstract methods region below. + ''' + + Public MustInherit Class DataProvider + +#Region "Shared/Static Methods" + + ' singleton reference to the instantiated object + Private Shared objProvider As DataProvider = Nothing + + ' constructor + Shared Sub New() + CreateProvider() + End Sub + + ' dynamically create provider + Private Shared Sub CreateProvider() + objProvider = CType(Framework.Reflection.CreateObject("data", "Christoc.Modules.TwitterFeed.Data", ""), DataProvider) + End Sub + + ' return the provider + Public Shared Shadows Function Instance() As DataProvider + Return objProvider + End Function + +#End Region + +#Region "Abstract methods" + 'public MustOverride function GetItems(ByVal moduleId as Integer) as IDataReader + 'public MustOverride function GetItem(ByVal itemid as Integer) as IDataReader +#End Region + + End Class + +End Namespace \ No newline at end of file diff --git a/Documentation/Documentation.css b/Documentation/Documentation.css new file mode 100644 index 0000000..62d028e --- /dev/null +++ b/Documentation/Documentation.css @@ -0,0 +1,82 @@ + +Body, A +{ + font-family: Verdana, Arial, Helvetica, Sans Serif; + font-size: 10pt; + font-weight: normal; + color: black; +} + +Body +{ + background-color: white; + margin-left:25px; +} + +H1 +{ + font-size: 2.0em; + font-weight: bold; + color: #75808A; + text-decoration: underline; +} + +H2 { + font-size: 1.6em; + font-weight: bold; + color: #75808A; +} + +H3 { + font-size: 1.4em; + font-weight: bold; + color: #75808A; +} + +H4 { + font-size: 1.2em; + font-weight: bold; + color: #75808A; +} + +H5 { + font-size: 1.1em; + font-weight: bold; + color: #75808A; +} + +H6 { + font-size: 1.0em; + font-weight: bold; + color: #75808A; +} + +A:link { + font-size: 1.0em; + text-decoration: underline; + color: #0000cc; +} + +A:visited { + font-size: 1.0em; + text-decoration: underline; + color: #0000cc; +} + +A:active { + font-size: 1.0em; + text-decoration: underline; + color: #0000cc; +} + +A:hover { + font-size: 1.0em; + text-decoration: underline; + color: #cc0000; +} + +HR { + color: dimgrey; + height:1pt; + text-align:left +} diff --git a/Documentation/Documentation.html b/Documentation/Documentation.html new file mode 100644 index 0000000..f1a8433 --- /dev/null +++ b/Documentation/Documentation.html @@ -0,0 +1,75 @@ + + + + Christoc.com Template + + + +
+

Christoc.com TwitterFeed Module

+
+

* Important *

+

+ When creating a project using this template, you should have named your project + simply "ModuleName", not "Christoc.comModuleName". If you didn't do this, the + easiest thing to do is close the solution, delete the folder from your DesktopModules + folder, then create a new project. +

+

+ Due to limitations in the templating capabilities of Visual Studio, you will need + to make some minor changes, and double check a few things, before you package this module. +

+
    +
  1. + Open up IIS Manager (start>run>INETMGR), go to your DNNDEV.ME website and make sure that DesktopModules is NOT a Virtual Directory/Application, if so, remove that. +
  2. +
  3. + If you change the TARGET framework for the project, remove the WEB.CONFIG file that Visual Studio will add to your project. +
  4. +
  5. BEFORE checking the + module into your source control environment check the following.
  6. +
  7. Edit the Project properties by double-clicking on the Properties folder in Solution + Explorer
  8. +
  9. On the Web tab: +
      +
    1. Under 'Start Action', make sure to set your Start URL to the correct site (ex: http://dnndev.me/).
    2. +
    3. Under 'Servers', make sure to "Use IIS Web Server" with a project url of http://dnndev.me/desktopmodules/TwitterFeed + and an Override application root URL of http://dnndev.me/
    4. +
    +
  10. +
+ +

DotNetNuke Module Development Tutorials +

+ + + +

Steps after your project is setup.

+
    +
  1. To Build and Package your Module you need to change to Release mode and then + simply choose Build from the Build menu. The MSBuild scripts will do the packaging + process for you. The packaging process creates an INSTALL and a SOURCE package in + the INSTALL folder within your desktopmodule/modulename folder.
  2. +
  3. Installing your module in your development DotNetNuke instance is easy.Take the + INSTALL ZIP file that is created in the INSTALL folder, upload that using the Host/Extensions + page, Installation Wizard. Using the INSTALL ZIP file will overwrite the files already in this folder, + but that shouldn't cause any problems as long as you install a recent build.
  4. +
  5. After you've done a release for your module (typically deploying to an environment + outside of your development environment) you should change the Version number, you + need to do this in two places, the assemblyinfo file, and the .DNN manifest file. + Next time you build the module in release mode you will get a new package (using + the version number) created.
  6. +
  7. For more information visit our DotNetNuke Consulting page.
  8. +
+

+ After you are finished reading this Documentation you can delete the Documentation directory + from your project. +

+
+
+
+ + diff --git a/License.txt b/License.txt new file mode 100644 index 0000000..b05da0f --- /dev/null +++ b/License.txt @@ -0,0 +1,21 @@ +
+

License

+

+ dnn-connect.org http://dnn-connect.org
+ Copyright (c) 2014
+ by dnn-connect.org
+

+

+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + documentation files (the "Software"), to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + to permit persons to whom the Software is furnished to do so, subject to the following conditions: +

+

+ The above copyright notice and this permission notice shall be included in all copies or substantial portions + of the Software. +

+

+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +

+
\ No newline at end of file diff --git a/My Project/AssemblyInfo.vb b/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..47d72a0 --- /dev/null +++ b/My Project/AssemblyInfo.vb @@ -0,0 +1,34 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt new file mode 100644 index 0000000..c54fc46 --- /dev/null +++ b/ReleaseNotes.txt @@ -0,0 +1,14 @@ +

TwitterFeed

+

+ dnn-connect.org
+ module.twitterfeed@dnn-connect.org
+ http://dnn-connect.org +

+
+
+

About TwitterFeed

+

+ Version 00.00.01 +

+

Initial release of the module

+
\ No newline at end of file diff --git a/Resources.zip b/Resources.zip new file mode 100644 index 0000000000000000000000000000000000000000..4cacc95e77b89117ed4eb41e5e496040b8a8b98a GIT binary patch literal 45358 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 literal 0 HcmV?d00001 diff --git a/Services/ClientFeedController.vb b/Services/ClientFeedController.vb new file mode 100644 index 0000000..22e6aac --- /dev/null +++ b/Services/ClientFeedController.vb @@ -0,0 +1,84 @@ +Imports System +Imports System.Net +Imports System.Net.Http +Imports System.Web.Http +Imports DotNetNuke.Web.Api +Imports DotNetNuke.Services.Localization +Imports System.IO + +Namespace Services + + Public Class ClientFeedController + Inherits DnnApiController + + Private _TokenKey As String = "" + Private _TokenSecret As String = "" + Private _ConsumerKey As String = "" + Private _ConsumerSecret As String = "" + Private _Displaymode As String = "" + Private _Template As String = "" + Private _SearchFor As String = "" + Private _PostCount As String = "10" + Private _RefreshInterval As String = "30" + Private _settings As Hashtable + + _ + Public Function TwitterSearchResult() As HttpResponseMessage + + _settings = ActiveModule.ModuleSettings() + LoadSettings() + + Dim feed As New List(Of TwitterPost) + Dim ctrl As New FeedController(_TokenKey, _TokenSecret, _ConsumerKey, _ConsumerSecret) + + Select Case _Displaymode.ToLower + Case "u" + feed = ctrl.GetUserTimeLine(_SearchFor, _PostCount) + Case "s" + feed = ctrl.SearchTweets(_SearchFor, _PostCount) + End Select + + Dim strHtml As String = "" + Dim strTemplatePath As String = _Template.Replace("/", "\") + Dim strPath As String = HttpRuntime.AppDomainAppPath & strTemplatePath + Dim strTemplate As String = "" + + strTemplate = strPath & "\Header.htm" + Dim helper As New TemplateProcessor(_settings) + helper.ProcessSurroundingTemplate(strHtml, Helpers.ReadTemplate(strTemplate)) + + For i As Integer = 0 To feed.Count - 1 + + If (i And 1) = 0 Then + strTemplate = strPath & "\Item.htm" + Else + strTemplate = strPath & "\ItemAlternate.htm" + End If + helper.ProcessItemTemplate(strHtml, Helpers.ReadTemplate(strTemplate), feed(i)) + + Next + + strTemplate = strPath & "\Footer.htm" + helper.ProcessSurroundingTemplate(strHtml, Helpers.ReadTemplate(strTemplate)) + + Return Request.CreateResponse(HttpStatusCode.OK, strHtml) + + + End Function + + Private Sub LoadSettings() + If (_settings.Contains("Twitter_SelectedTemplate")) Then _Template = _settings("Twitter_SelectedTemplate").ToString() + If (_settings.Contains("Twitter_DisplayMode")) Then _Displaymode = _settings("Twitter_DisplayMode").ToString() + If (_settings.Contains("Twitter_ConsumerKey")) Then _ConsumerKey = _settings("Twitter_ConsumerKey").ToString() + If (_settings.Contains("Twitter_ConsumerSecret")) Then _ConsumerSecret = _settings("Twitter_ConsumerSecret").ToString() + If (_settings.Contains("Twitter_TokenKey")) Then _TokenKey = _settings("Twitter_TokenKey").ToString() + If (_settings.Contains("Twitter_TokenSecret")) Then _TokenSecret = _settings("Twitter_TokenSecret").ToString() + If (_settings.Contains("Twitter_SearchFor")) Then _SearchFor = _settings("Twitter_SearchFor").ToString() + If (_settings.Contains("Twitter_PostCount")) Then _PostCount = _settings("Twitter_PostCount").ToString() + If (_settings.Contains("Twitter_RefreshInterval")) Then _RefreshInterval = _settings("Twitter_RefreshInterval").ToString() + End Sub + + End Class + +End Namespace + diff --git a/Services/RouteMapper.vb b/Services/RouteMapper.vb new file mode 100644 index 0000000..7537097 --- /dev/null +++ b/Services/RouteMapper.vb @@ -0,0 +1,16 @@ +Imports System +Imports DotNetNuke.Web.Api + +Namespace Services + Public Class RouteMapper + Implements IServiceRouteMapper + + Public Sub RegisterRoutes(mapRouteManager As IMapRoute) Implements IServiceRouteMapper.RegisterRoutes + + mapRouteManager.MapHttpRoute("Connect/TwitterFeed", "default", "{controller}/{action}", New String() {"Connect.Modules.TwitterFeed.Services"}) + + End Sub + + End Class +End Namespace + diff --git a/Settings.ascx b/Settings.ascx new file mode 100644 index 0000000..82ea3bd --- /dev/null +++ b/Settings.ascx @@ -0,0 +1,62 @@ +<%@ Control Language="vb" AutoEventWireup="true" CodeBehind="Settings.ascx.vb" Inherits="Connect.Modules.TwitterFeed.Settings" %> +<%@ Register TagName="label" TagPrefix="dnn" Src="~/controls/labelcontrol.ascx" %> + +

<%=LocalizeString("AuthenticationSettings")%>

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +

<%=LocalizeString("DisplaySettings")%>

+
+
+ + + + + +
+
+ + +
+
+ + + +
+
+ + + +
+
+ + + +
+ +
+ + + + + +
+ + +
\ No newline at end of file diff --git a/Settings.ascx.designer.vb b/Settings.ascx.designer.vb new file mode 100644 index 0000000..0fc784e --- /dev/null +++ b/Settings.ascx.designer.vb @@ -0,0 +1,195 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class Settings + + ''' + '''lblTokenKey control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblTokenKey As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''txtTokenKey control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents txtTokenKey As Global.System.Web.UI.WebControls.TextBox + + ''' + '''lblTokenSecret control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblTokenSecret As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''txtTokenSecret control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents txtTokenSecret As Global.System.Web.UI.WebControls.TextBox + + ''' + '''lblConsumerKey control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblConsumerKey As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''txtConsumerKey control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents txtConsumerKey As Global.System.Web.UI.WebControls.TextBox + + ''' + '''lblConsumerSecret control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblConsumerSecret As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''txtConsumerSecret control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents txtConsumerSecret As Global.System.Web.UI.WebControls.TextBox + + ''' + '''lblDisplaymode control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblDisplaymode As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''drpDisplaymode control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents drpDisplaymode As Global.System.Web.UI.WebControls.DropDownList + + ''' + '''lblSearchFor control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblSearchFor As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''txtSearchFor control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents txtSearchFor As Global.System.Web.UI.WebControls.TextBox + + ''' + '''lblCount control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblCount As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''drpCount control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents drpCount As Global.System.Web.UI.WebControls.DropDownList + + ''' + '''lblInterval control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblInterval As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''drpInterval control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents drpInterval As Global.System.Web.UI.WebControls.DropDownList + + ''' + '''lblTemplate control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblTemplate As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''drpTemplate control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents drpTemplate As Global.System.Web.UI.WebControls.DropDownList + + ''' + '''lblRenderingMode control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblRenderingMode As Global.DotNetNuke.UI.UserControls.LabelControl + + ''' + '''drpRenderingMode control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents drpRenderingMode As Global.System.Web.UI.WebControls.DropDownList +End Class diff --git a/Settings.ascx.vb b/Settings.ascx.vb new file mode 100644 index 0000000..d90d2dd --- /dev/null +++ b/Settings.ascx.vb @@ -0,0 +1,110 @@ +' Copyright (c) 2014 Christoc.com +' All rights reserved. +' +' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +Imports DotNetNuke +Imports DotNetNuke.Services.Exceptions +Imports DotNetNuke.Entities.Modules + + +Public Class Settings + Inherits ModuleSettingsBase + +#Region "Base Method Implementations" + + Public Overrides Sub LoadSettings() + Try + If (Page.IsPostBack = False) Then + + LocalizeForm() + BindTemplates() + BindCount() + BindIntervals() + + Try + If (Settings.Contains("Twitter_SelectedTemplate")) Then drpTemplate.SelectedValue = Settings("Twitter_SelectedTemplate").ToString() + Catch + End Try + If (Settings.Contains("Twitter_DisplayMode")) Then drpDisplaymode.SelectedValue = Settings("Twitter_DisplayMode").ToString() + If (Settings.Contains("Twitter_ConsumerKey")) Then txtConsumerKey.Text = Settings("Twitter_ConsumerKey").ToString() + If (Settings.Contains("Twitter_ConsumerSecret")) Then txtConsumerSecret.Text = Settings("Twitter_ConsumerSecret").ToString() + If (Settings.Contains("Twitter_TokenKey")) Then txtTokenKey.Text = Settings("Twitter_TokenKey").ToString() + If (Settings.Contains("Twitter_TokenSecret")) Then txtTokenSecret.Text = Settings("Twitter_TokenSecret").ToString() + If (Settings.Contains("Twitter_SearchFor")) Then txtSearchFor.Text = Settings("Twitter_SearchFor").ToString() + If (Settings.Contains("Twitter_PostCount")) Then drpCount.SelectedValue = Settings("Twitter_PostCount").ToString() + If (Settings.Contains("Twitter_RefreshInterval")) Then drpInterval.SelectedValue = Settings("Twitter_RefreshInterval").ToString() + If (Settings.Contains("Twitter_RenderingMode")) Then drpRenderingMode.SelectedValue = Settings("Twitter_RenderingMode").ToString() + + End If + Catch exc As Exception 'Module failed to load + ProcessModuleLoadException(Me, exc) + End Try + End Sub + + Public Overrides Sub UpdateSettings() + Try + Dim objModules As New DotNetNuke.Entities.Modules.ModuleController + + objModules.UpdateModuleSetting(ModuleId, "Twitter_SelectedTemplate", drpTemplate.SelectedValue) + objModules.UpdateModuleSetting(ModuleId, "Twitter_DisplayMode", drpDisplaymode.SelectedValue) + objModules.UpdateModuleSetting(ModuleId, "Twitter_ConsumerKey", txtConsumerKey.Text) + objModules.UpdateModuleSetting(ModuleId, "Twitter_ConsumerSecret", txtConsumerSecret.Text) + objModules.UpdateModuleSetting(ModuleId, "Twitter_TokenKey", txtTokenKey.Text) + objModules.UpdateModuleSetting(ModuleId, "Twitter_TokenSecret", txtTokenSecret.Text) + objModules.UpdateModuleSetting(ModuleId, "Twitter_SearchFor", txtSearchFor.Text) + objModules.UpdateModuleSetting(ModuleId, "Twitter_PostCount", drpCount.SelectedValue) + objModules.UpdateModuleSetting(ModuleId, "Twitter_RefreshInterval", drpInterval.SelectedValue) + objModules.UpdateModuleSetting(ModuleId, "Twitter_RenderingMode", drpRenderingMode.SelectedValue) + + Catch exc As Exception 'Module failed to load + ProcessModuleLoadException(Me, exc) + End Try + End Sub + + Private Sub BindIntervals() + + drpInterval.Items.Clear() + For i As Integer = 30 To 300 Step 30 + drpInterval.Items.Add(New ListItem(i.ToString, i.ToString)) + Next + + End Sub + + Private Sub BindCount() + + drpCount.Items.Clear() + For i As Integer = 1 To 30 + drpCount.Items.Add(New ListItem(i.ToString, i.ToString)) + Next + + End Sub + + Private Sub BindTemplates() + + drpTemplate.Items.Clear() + Dim basepath As String = Server.MapPath(Me.TemplateSourceDirectory & "/templates/") + + For Each folder As String In System.IO.Directory.GetDirectories(basepath) + Dim foldername As String = folder.Substring(folder.LastIndexOf("\") + 1) + Dim folderpath As String = Me.TemplateSourceDirectory & "/templates/" & foldername + drpTemplate.Items.Add(New ListItem(foldername, folderpath)) + Next + + End Sub + + Private Sub LocalizeForm() + + For Each item As ListItem In drpDisplaymode.Items + item.Text = LocalizeString(item.Text) + Next + + For Each item As ListItem In drpRenderingMode.Items + item.Text = LocalizeString(item.Text) + Next + + End Sub + +#End Region + + +End Class \ No newline at end of file diff --git a/Templates/DarkBackground/Footer.htm b/Templates/DarkBackground/Footer.htm new file mode 100644 index 0000000..341e6e5 --- /dev/null +++ b/Templates/DarkBackground/Footer.htm @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/Templates/DarkBackground/Header.htm b/Templates/DarkBackground/Header.htm new file mode 100644 index 0000000..f9295e6 --- /dev/null +++ b/Templates/DarkBackground/Header.htm @@ -0,0 +1 @@ +
diff --git a/Templates/DarkBackground/Item.htm b/Templates/DarkBackground/Item.htm new file mode 100644 index 0000000..3f0ac22 --- /dev/null +++ b/Templates/DarkBackground/Item.htm @@ -0,0 +1,16 @@ +
+ +
+ [AUTHORFULLNAME] +
+ +
+

[HTMLCONTENT]

+ [HASEMBEDDEDIMAGE]

[/HASEMBEDDEDIMAGE] +
+ +
+ by @[AUTHORSCREENNAME] [PUBLISHDATE][PUBLISHTIME] +
+ +
\ No newline at end of file diff --git a/Templates/DarkBackground/ItemAlternate.htm b/Templates/DarkBackground/ItemAlternate.htm new file mode 100644 index 0000000..77f25dd --- /dev/null +++ b/Templates/DarkBackground/ItemAlternate.htm @@ -0,0 +1,16 @@ +
+ +
+ [AUTHORFULLNAME] +
+ +
+

[HTMLCONTENT]

+ [HASEMBEDDEDIMAGE]

[/HASEMBEDDEDIMAGE] +
+ +
+ by @[AUTHORSCREENNAME] [PUBLISHDATE][PUBLISHTIME] +
+ +
\ No newline at end of file diff --git a/Templates/DarkBackground/images/twitter.png b/Templates/DarkBackground/images/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..60cefb541e006c512f01fa26792f60197962faa8 GIT binary patch literal 15327 zcmeI3eQXqE9>)hTMv7#`E*4-{Gx}|Olv|7aJ%+q%0?#?CVRErA~LMa-H{gFb({Irz_Q?$PxqPt);uygF{JR@82qbvm6i!_gdPfeMS(AJK(` zC8AZPOfo(`poyv+)nz4OGJJ(jC8oR0W}~6(Cq1rkG!V!(717f4AV)eOL}|8~p~GRi zSf-{2L9UZUGqu+KD4>HtQ(~$JpuDoUQGFlmU3#=PVN~A-B6?9PIA=FDD%QRvW^b0rYHC@w)?dTb`#G=IUvI79 zoV6~xq(yE;rJE^YZ{z&6R^|b=&g!tUY&~1Y)p)&j#=+Wc_Bw~1$=D;Q1-6Y5O&1~} zNcUQXy{?h$oq+ACwba@qU~z~xAr%RdQ{aGTW4X?3&yn;3YadYMJ|Ov3C7j$WQ9;#! zv2fky%*xH~t~Al)(&y#EKH*6gq~`hq&0VQ#>9@>LL2Ax9OE@>w!UfVGYr3NLBNax6 zjN_vPJTbX6QxTGHl311--08d^8V8d{6CiaLt?5WvuFI(mqoI_b2<)3%00rr#+lcpo zhzFk3HVea9Shkh5@-_!=cT_Pf&%kAxvP!B-n`lax9v4(l*9|wBCv|IR&YTn`uh(?% z8aW~r&1L_yir~^R@9-Yld&uB&E#r2q===)nCj5og>2oQRaKVJGUh0!cDoL zTEs^Z`7T8b3%W-R3*CT@M!H>et`JdX?*P142`MV<7VubIbg^P2%Q*Xu(;6-xA-Pdl z7hO=6uWvJss!%Mcho?CF(5&&BPDQKpQ`>KxidN^R<}z1BWZlE1Tgxj(vWy#43PuZj zCcO7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL z2`(%mR6uZ{G_Wzjg++u42riTcHohUQvfQhdAOhd7jKdcx|IxAg5PS*KBsK&C6g9Ar zqBd=%sB6E#>lj7F7>fG#af;%1QPf?^j&&#e6gA~Uqpz+t@ztrpPuI_WxZ-acM^E45 z-64NA_nC`L`)2IzdswfmICpu`zsJALJ~s*gPXSt(qd@l(rt)Qg*LA6|U5^2%S! zUYs+Fa_zlvU^{(z&gQ?A-yUE7$;<1{ZdTwX{;@o9XyohKZPSk(+~fXYLEqj> z%DWwjsCC_n589Y%|E1O~9Us}b?d^GgZ@;_hXn0NU(GSl&*|%uJhPRrpkKKChjsyKt z{Eq9b8wL*^5cfaZ6`31cT=o2%WoyrFeQe81jlspIc8wgncyjdhk(2w5otwC@x#^$n z_xB&X>l(ND!}Aw6{(1SSM9V|w@?9(ccX53EkK*TV-ucvb3#%p`mA={Yr(pYuq2~Wj zeErF)X}jsy-%)BV{d{=!g?ofAjt45Y^2Y|P5AL)c-rsv-C>HwH_^|RVJN11})9^>v zk1m|)Te0ZwY4f(;_tMm-Z~f)ej+V!oOqGM~iaq9M|9xot?A@csJtLtrv&P0YUYYmP beCqq5Hy(U-Wo*!R1-G%j$+!Q3$G7|nl=Sa4 literal 0 HcmV?d00001 diff --git a/Templates/DarkBackground/template.css b/Templates/DarkBackground/template.css new file mode 100644 index 0000000..1a12215 --- /dev/null +++ b/Templates/DarkBackground/template.css @@ -0,0 +1,18 @@ +.connect-twitterfeed-item { margin: 0 0 10px 0; background: transparent; padding: 10px;} +.connect-twitterfeed-item.alternate { background: transparent; } +.connect-twitterfeed-profilepic { width: 15%; float:left; } +.connect-twitterfeed-profilepic img { padding: 2px; background: #fff; border: 1px solid #ccc; width: 100%; margin: 6px 0 0 0; } +.connect-twitterfeed-content { width: 70%; float: left; margin: 0 0 0 5%; } +.connect-twitterfeed-content p { margin: 0; padding: 0 0 5px 0; color: #fefefe; font-size: 12px; } +.connect-twitterfeed-content p img { width: 100%; max-width: 250px; margin: 0;} +.connect-twitterfeed-content p a { color: #fff; text-decoration: underline; font-size: 12px; } +.connect-twitterfeed-content p a:hover { color: #333; text-decoration: underline; } +.connect-twitterfeed-author { padding: 5px 0 0 0; clear:both;} +.connect-twitterfeed-author span, +.connect-twitterfeed-author span a { font-size: 10px; } +.connect-twitterfeed-author span { color: #fefefe; } +.connect-twitterfeed-author span a { color: #fff; text-decoration: none; } +.connect-twitterfeed-author span a:hover{ color: #333; text-decoration: underline; } +.connect-twitterfeed-footer { padding: 10px 0 20px 10px; } +.connect-twitterfeed-footer a { background: #00aced url(images/twitter.png) 5px 5px no-repeat; font-size: 14px; color: #fff; text-decoration: none; padding: 5px 10px 5px 30px; border: 1px solid #0776a0; } +.connect-twitterfeed-footer a:hover { color: #333; } \ No newline at end of file diff --git a/Templates/Default/Footer.htm b/Templates/Default/Footer.htm new file mode 100644 index 0000000..341e6e5 --- /dev/null +++ b/Templates/Default/Footer.htm @@ -0,0 +1,4 @@ + +
\ No newline at end of file diff --git a/Templates/Default/Header.htm b/Templates/Default/Header.htm new file mode 100644 index 0000000..35d2f7e --- /dev/null +++ b/Templates/Default/Header.htm @@ -0,0 +1 @@ +
diff --git a/Templates/Default/Item.htm b/Templates/Default/Item.htm new file mode 100644 index 0000000..b09be09 --- /dev/null +++ b/Templates/Default/Item.htm @@ -0,0 +1,16 @@ +
+ +
+ [AUTHORFULLNAME] +
+ +
+

[HTMLCONTENT]

+ [HASEMBEDDEDIMAGE]

[/HASEMBEDDEDIMAGE] +
+ +
+ by @[AUTHORSCREENNAME] [PUBLISHDATE][PUBLISHTIME] +
+ +
\ No newline at end of file diff --git a/Templates/Default/ItemAlternate.htm b/Templates/Default/ItemAlternate.htm new file mode 100644 index 0000000..77f25dd --- /dev/null +++ b/Templates/Default/ItemAlternate.htm @@ -0,0 +1,16 @@ +
+ +
+ [AUTHORFULLNAME] +
+ +
+

[HTMLCONTENT]

+ [HASEMBEDDEDIMAGE]

[/HASEMBEDDEDIMAGE] +
+ +
+ by @[AUTHORSCREENNAME] [PUBLISHDATE][PUBLISHTIME] +
+ +
\ No newline at end of file diff --git a/Templates/Default/images/twitter.png b/Templates/Default/images/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..60cefb541e006c512f01fa26792f60197962faa8 GIT binary patch literal 15327 zcmeI3eQXqE9>)hTMv7#`E*4-{Gx}|Olv|7aJ%+q%0?#?CVRErA~LMa-H{gFb({Irz_Q?$PxqPt);uygF{JR@82qbvm6i!_gdPfeMS(AJK(` zC8AZPOfo(`poyv+)nz4OGJJ(jC8oR0W}~6(Cq1rkG!V!(717f4AV)eOL}|8~p~GRi zSf-{2L9UZUGqu+KD4>HtQ(~$JpuDoUQGFlmU3#=PVN~A-B6?9PIA=FDD%QRvW^b0rYHC@w)?dTb`#G=IUvI79 zoV6~xq(yE;rJE^YZ{z&6R^|b=&g!tUY&~1Y)p)&j#=+Wc_Bw~1$=D;Q1-6Y5O&1~} zNcUQXy{?h$oq+ACwba@qU~z~xAr%RdQ{aGTW4X?3&yn;3YadYMJ|Ov3C7j$WQ9;#! zv2fky%*xH~t~Al)(&y#EKH*6gq~`hq&0VQ#>9@>LL2Ax9OE@>w!UfVGYr3NLBNax6 zjN_vPJTbX6QxTGHl311--08d^8V8d{6CiaLt?5WvuFI(mqoI_b2<)3%00rr#+lcpo zhzFk3HVea9Shkh5@-_!=cT_Pf&%kAxvP!B-n`lax9v4(l*9|wBCv|IR&YTn`uh(?% z8aW~r&1L_yir~^R@9-Yld&uB&E#r2q===)nCj5og>2oQRaKVJGUh0!cDoL zTEs^Z`7T8b3%W-R3*CT@M!H>et`JdX?*P142`MV<7VubIbg^P2%Q*Xu(;6-xA-Pdl z7hO=6uWvJss!%Mcho?CF(5&&BPDQKpQ`>KxidN^R<}z1BWZlE1Tgxj(vWy#43PuZj zCcO7fJ&g6I@tCsDR)?X<%c53yTO95L_q?Y)o)r5upNt3#EaL z2`(%mR6uZ{G_Wzjg++u42riTcHohUQvfQhdAOhd7jKdcx|IxAg5PS*KBsK&C6g9Ar zqBd=%sB6E#>lj7F7>fG#af;%1QPf?^j&&#e6gA~Uqpz+t@ztrpPuI_WxZ-acM^E45 z-64NA_nC`L`)2IzdswfmICpu`zsJALJ~s*gPXSt(qd@l(rt)Qg*LA6|U5^2%S! zUYs+Fa_zlvU^{(z&gQ?A-yUE7$;<1{ZdTwX{;@o9XyohKZPSk(+~fXYLEqj> z%DWwjsCC_n589Y%|E1O~9Us}b?d^GgZ@;_hXn0NU(GSl&*|%uJhPRrpkKKChjsyKt z{Eq9b8wL*^5cfaZ6`31cT=o2%WoyrFeQe81jlspIc8wgncyjdhk(2w5otwC@x#^$n z_xB&X>l(ND!}Aw6{(1SSM9V|w@?9(ccX53EkK*TV-ucvb3#%p`mA={Yr(pYuq2~Wj zeErF)X}jsy-%)BV{d{=!g?ofAjt45Y^2Y|P5AL)c-rsv-C>HwH_^|RVJN11})9^>v zk1m|)Te0ZwY4f(;_tMm-Z~f)ej+V!oOqGM~iaq9M|9xot?A@csJtLtrv&P0YUYYmP beCqq5Hy(U-Wo*!R1-G%j$+!Q3$G7|nl=Sa4 literal 0 HcmV?d00001 diff --git a/Templates/Default/template.css b/Templates/Default/template.css new file mode 100644 index 0000000..fbeac54 --- /dev/null +++ b/Templates/Default/template.css @@ -0,0 +1,18 @@ +.connect-twitterfeed-item { margin: 0 0 10px 0; background: #fff; padding: 10px;} +.connect-twitterfeed-item.alternate { background: #eee; } +.connect-twitterfeed-profilepic { width: 15%; float:left; } +.connect-twitterfeed-profilepic img { padding: 2px; background: #fff; border: 1px solid #ccc; width: 100%; margin: 6px 0 0 0; } +.connect-twitterfeed-content { width: 70%; float: left; margin: 0 0 0 5%; } +.connect-twitterfeed-content p { margin: 0; padding: 0 0 5px 0; color: #333; font-size: 12px; } +.connect-twitterfeed-content p img { width: 100%; max-width: 250px; margin: 0;} +.connect-twitterfeed-content p a { color: #4a95e8; text-decoration: none; font-size: 12px; } +.connect-twitterfeed-content p a:hover { color: #333; text-decoration: underline; } +.connect-twitterfeed-author { padding: 5px 0 0 0; clear:both;} +.connect-twitterfeed-author span, +.connect-twitterfeed-author span a { font-size: 10px; } +.connect-twitterfeed-author span { color: #000; } +.connect-twitterfeed-author span a { color: #4a95e8; text-decoration: none; } +.connect-twitterfeed-author span a:hover{ color: #333; text-decoration: underline; } +.connect-twitterfeed-footer { padding: 10px 0 20px 10px; } +.connect-twitterfeed-footer a { background: #00aced url(images/twitter.png) 5px 5px no-repeat; font-size: 14px; color: #fff; text-decoration: none; padding: 5px 10px 5px 30px; } +.connect-twitterfeed-footer a:hover { color: #333; } \ No newline at end of file diff --git a/TwitterFeed.dnn b/TwitterFeed.dnn new file mode 100644 index 0000000..8c5c939 --- /dev/null +++ b/TwitterFeed.dnn @@ -0,0 +1,76 @@ + + + + TwitterFeed + dnn-connect.org TwitterFeed module + DesktopModules/Connect/TwitterFeed/Images/moduleicon.png + + Philipp Becker + dnn-connect.org + http://dnn-connect.org + module.twitterfeed@dnn-connect.org + + + + + 07.00.02 + + + + + + DesktopModules/Connect/TwitterFeed + + Resources.zip + + + + + + + TwitterFeed + TwitterFeed + + + + + TwitterFeed + 0 + + + + DesktopModules/Connect/TwitterFeed/View.ascx + False + + View + + + 0 + + + Settings + DesktopModules/Connect/TwitterFeed/Settings.ascx + False + TwitterFeed Settings + Edit + + + 0 + + + + + + + + + + Connect.Modules.TwitterFeed.dll + bin + + + + + + + \ No newline at end of file diff --git a/TwitterFeed.sln b/TwitterFeed.sln new file mode 100644 index 0000000..5a11295 --- /dev/null +++ b/TwitterFeed.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TwitterFeed", "TwitterFeed.vbproj", "{279C5C96-5031-407A-919C-EF50FD06454D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {279C5C96-5031-407A-919C-EF50FD06454D}.Debug|Any CPU.ActiveCfg = Release|Any CPU + {279C5C96-5031-407A-919C-EF50FD06454D}.Debug|Any CPU.Build.0 = Release|Any CPU + {279C5C96-5031-407A-919C-EF50FD06454D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {279C5C96-5031-407A-919C-EF50FD06454D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/TwitterFeed.vbproj b/TwitterFeed.vbproj new file mode 100644 index 0000000..d5f3387 --- /dev/null +++ b/TwitterFeed.vbproj @@ -0,0 +1,211 @@ + + + + + Debug + AnyCPU + + + + + {279C5C96-5031-407A-919C-EF50FD06454D} + {349c5851-65df-11da-9384-00065b846f21};{F184B08F-C81C-45F6-A57F-5ABD9991F28F} + Library + Connect.Modules.TwitterFeed + Connect.Modules.TwitterFeed + v4.0 + Custom + false + + + + + + + true + full + true + true + ..\..\..\bin\ + Connect.Modules.TwitterFeed.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + ..\..\..\bin\ + Connect.Modules.TwitterFeed.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + + ..\..\..\bin\DotNetNuke.dll + False + + + False + ..\..\..\bin\DotNetNuke.Web.dll + + + + + + + + False + ..\..\..\bin\System.Net.Http.dll + + + False + ..\..\..\bin\System.Net.Http.Formatting.dll + + + + + False + ..\..\..\bin\System.Web.Http.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Settings.ascx + + + Settings.ascx + ASPXCodeBehind + + + + View.ascx + + + View.ascx + ASPXCodeBehind + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + On + + + Binary + + + Off + + + On + + + + + + + + + True + True + 62640 + / + http://dnnconnect/desktopmodules/connect/TwitterFeed + True + http://dnnconnect/ + False + False + + + False + + + + + + zip + TwitterFeed + Connect.TwitterFeed + $(MSBuildProjectDirectory)\BuildScripts + + + + + \ No newline at end of file diff --git a/View.ascx b/View.ascx new file mode 100644 index 0000000..e64b6f3 --- /dev/null +++ b/View.ascx @@ -0,0 +1,15 @@ +<%@ Control Language="vb" AutoEventWireup="true" CodeBehind="View.ascx.vb" Inherits="Connect.Modules.TwitterFeed.View" %> + + + +

+
+ + + + + + + + +
diff --git a/View.ascx.designer.vb b/View.ascx.designer.vb new file mode 100644 index 0000000..a21a538 --- /dev/null +++ b/View.ascx.designer.vb @@ -0,0 +1,51 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class View + + ''' + '''pnlSettingsIncomplete control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents pnlSettingsIncomplete As Global.System.Web.UI.WebControls.Panel + + ''' + '''lblSettingsIncomplete control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lblSettingsIncomplete As Global.System.Web.UI.WebControls.Literal + + ''' + '''rptFeed control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents rptFeed As Global.System.Web.UI.WebControls.Repeater + + ''' + '''pnlClientSideTweets control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents pnlClientSideTweets As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/View.ascx.vb b/View.ascx.vb new file mode 100644 index 0000000..8f7b5a5 --- /dev/null +++ b/View.ascx.vb @@ -0,0 +1,220 @@ + +Imports DotNetNuke +Imports DotNetNuke.Entities.Modules.Actions +Imports DotNetNuke.Entities.Modules +Imports DotNetNuke.Services.Exceptions +Imports DotNetNuke.Services.Localization +Imports System.IO +Imports DotNetNuke.Framework + +Public Class View + Inherits PortalModuleBase + +#Region "Private Members" + + Private _TokenKey As String = "" + Private _TokenSecret As String = "" + Private _ConsumerKey As String = "" + Private _ConsumerSecret As String = "" + Private _Displaymode As String = "" + Private _Template As String = Me.TemplateSourceDirectory & "\templates\_default.html" + Private _SearchFor As String = "" + Private _PostCount As String = "10" + Private _RefreshInterval As String = "30" + Private _RenderingMode As String = "S" + Private _processor As TemplateProcessor = Nothing + +#End Region + +#Region "Event Handlers" + + Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Init + Try + ServicesFramework.Instance.RequestAjaxAntiForgerySupport() + + LoadSettings() + + If ValidateSettings() Then + + pnlSettingsIncomplete.Visible = False + RegisterCss() + + If _RenderingMode = "C" Then + + RegisterScripts() + rptFeed.Visible = False + pnlClientSideTweets.Visible = True + + Else + + _processor = New TemplateProcessor(Settings) + rptFeed.Visible = True + BindData() + pnlClientSideTweets.Visible = False + + End If + + Else + + rptFeed.Visible = False + pnlSettingsIncomplete.Visible = True + lblSettingsIncomplete.Text = Localization.GetString("lblSettingsIncomplete", LocalResourceFile) + + End If + + Catch exc As Exception + Exceptions.ProcessModuleLoadException(Me, exc) + End Try + + End Sub + + Private Sub rptFeed_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles rptFeed.ItemDataBound + + Dim strTemplate As String = Server.MapPath(_Template) + + If (e.Item.ItemType = ListItemType.Header) Then + + strTemplate += "\Header.htm" + strTemplate = strTemplate.Replace("\\", "\") + + _processor.ProcessSurroundingTemplate(e.Item.Controls, Helpers.ReadTemplate(strTemplate)) + + End If + + If e.Item.ItemType = ListItemType.Item Then + + Dim objPost As TwitterPost = CType(e.Item.DataItem, TwitterPost) + strTemplate += "\Item.htm" + strTemplate = strTemplate.Replace("\\", "\") + + _processor.ProcessItemTemplate(e.Item.Controls, Helpers.ReadTemplate(strTemplate), objPost) + + End If + + If e.Item.ItemType = ListItemType.AlternatingItem Then + + Dim objPost As TwitterPost = CType(e.Item.DataItem, TwitterPost) + strTemplate += "\ItemAlternate.htm" + strTemplate = strTemplate.Replace("\\", "\") + + _processor.ProcessItemTemplate(e.Item.Controls, Helpers.ReadTemplate(strTemplate), objPost) + + End If + + If (e.Item.ItemType = ListItemType.Footer) Then + + strTemplate += "\Footer.htm" + strTemplate = strTemplate.Replace("\\", "\") + + _processor.ProcessSurroundingTemplate(e.Item.Controls, Helpers.ReadTemplate(strTemplate)) + + End If + + End Sub + +#End Region + +#Region "Private Methods" + + Private Sub RegisterCss() + + Dim strCssUrl As String = _Template & "/template.css" + + Dim blnAlreadyRegistered As Boolean = False + For Each ctrl As Control In Me.Page.Header.Controls + + If TypeOf (ctrl) Is HtmlLink Then + Dim ctrlCss As HtmlLink = CType(ctrl, HtmlLink) + If ctrlCss.Href.ToLower = strCssUrl.ToLower Then + blnAlreadyRegistered = True + Exit For + End If + End If + + Next + + If Not blnAlreadyRegistered Then + + Dim ctrlLink As New HtmlLink + ctrlLink.Href = strCssUrl + ctrlLink.Attributes.Add("rel", "stylesheet") + ctrlLink.Attributes.Add("type", "text/css") + ctrlLink.Attributes.Add("media", "screen") + + Me.Page.Header.Controls.Add(ctrlLink) + + End If + + End Sub + + Private Sub RegisterScripts() + + Dim strScript As String = vbCrLf & "" & vbCrLf + + Me.Page.ClientScript.RegisterClientScriptInclude("ConnectTwitterFeed", ResolveClientUrl(Me.TemplateSourceDirectory & "/js/TwitterFeed.js")) + Page.ClientScript.RegisterStartupScript(Me.[GetType](), "ConnectTwitterFeedScriptBlock", strScript) + + End Sub + + Private Sub BindData() + + Dim feed As New List(Of TwitterPost) + Dim ctrl As New FeedController(_TokenKey, _TokenSecret, _ConsumerKey, _ConsumerSecret) + + Select Case _Displaymode.ToLower + Case "u" + feed = ctrl.GetUserTimeLine(_SearchFor, _PostCount) + Case "s" + feed = ctrl.SearchTweets(_SearchFor, _PostCount) + End Select + + rptFeed.DataSource = feed + rptFeed.DataBind() + + End Sub + + Private Sub LoadSettings() + + If (Settings.Contains("Twitter_SelectedTemplate")) Then _Template = Settings("Twitter_SelectedTemplate").ToString() + If (Settings.Contains("Twitter_DisplayMode")) Then _Displaymode = Settings("Twitter_DisplayMode").ToString() + If (Settings.Contains("Twitter_ConsumerKey")) Then _ConsumerKey = Settings("Twitter_ConsumerKey").ToString() + If (Settings.Contains("Twitter_ConsumerSecret")) Then _ConsumerSecret = Settings("Twitter_ConsumerSecret").ToString() + If (Settings.Contains("Twitter_TokenKey")) Then _TokenKey = Settings("Twitter_TokenKey").ToString() + If (Settings.Contains("Twitter_TokenSecret")) Then _TokenSecret = Settings("Twitter_TokenSecret").ToString() + If (Settings.Contains("Twitter_SearchFor")) Then _SearchFor = Settings("Twitter_SearchFor").ToString() + If (Settings.Contains("Twitter_PostCount")) Then _PostCount = Settings("Twitter_PostCount").ToString() + If (Settings.Contains("Twitter_RefreshInterval")) Then _RefreshInterval = Settings("Twitter_RefreshInterval").ToString() + If (Settings.Contains("Twitter_RenderingMode")) Then _RenderingMode = Settings("Twitter_RenderingMode").ToString() + + End Sub + + Private Function ValidateSettings() As Boolean + + If String.IsNullOrEmpty(_TokenKey) Or String.IsNullOrEmpty(_TokenSecret) Or String.IsNullOrEmpty(_ConsumerKey) Or String.IsNullOrEmpty(_ConsumerSecret) Or String.IsNullOrEmpty(_SearchFor) Then + Return False + End If + + Return True + + End Function + + +#End Region + + + +End Class \ No newline at end of file diff --git a/images/moduleicon.png b/images/moduleicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f7dcc351ca2d543a84ed3621f872389d05aaaaf1 GIT binary patch literal 4414 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 beCqq5Hy(U-Wo*!R1-G%j$+!Q3$G7|nl=Sa4 literal 0 HcmV?d00001 diff --git a/install/Connect.TwitterFeed_00.00.01_Install.zip b/install/Connect.TwitterFeed_00.00.01_Install.zip new file mode 100644 index 0000000000000000000000000000000000000000..28d97456c74483ba5bddc61f058c048c91ecb8c0 GIT binary patch literal 35720 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 O_rI@?B6aPbtN#G;<%Q$` literal 0 HcmV?d00001 diff --git a/js/TwitterFeed.js b/js/TwitterFeed.js new file mode 100644 index 0000000..d667693 --- /dev/null +++ b/js/TwitterFeed.js @@ -0,0 +1,22 @@ +function setupTweets(mid) { + + var sf = $.ServicesFramework(mid); + + $.ajax({ + type: "GET", + url: sf.getServiceRoot('Connect/TwitterFeed') + 'ClientFeed/TwitterSearchResult', + beforeSend: sf.setModuleHeaders, + success: function (data) { + if (data.length > 0) { + $(".ConnectTweetContainer").hide().html(data).slideDown("slow"); + } + if (typeof (callback) != "undefined") { + callback(data); + } + }, + error: function (xhr, status, error) { + alert(error); + } + }); + +} \ No newline at end of file diff --git a/module.css b/module.css new file mode 100644 index 0000000..e69de29