Twitter status HtmlHelper

Detta är del ett av två inlägg.

Jag upptäckte i mitt tidigare inlägg hur användbart Htmlhelper var och därför bestämde jag mig för att göra en till. Nämligen en som hämtar det senaste Twitter status(ar) från din Twitter. Vi börjar med att skapa ett nytt ASP.NET 1 (2 Beta) projekt, skapar sedan en mapp som heter “Helpers” och där skapar vi en klass som vi döper till “Html.cs”.Varför vi inte döper den till “HtmlHelper.cs” är för att då kommer det krocka med “HtmlHelper.cs” som redan finns och som vi kommer använda oss av.

Vi får ändra våran Html klass till statisk, “public static class Html”. Vi skapar en statisk sträng som vi döper till “TwitterStatus”. Början av kodstycket ser ut såhär.

public static string TwitterStatus(this HtmlHelper helper, int numberOfMessages, string username, bool splitUserNameAndLink)
{
      StringBuilder sb = new StringBuilder();

sb.AppendLine("<ul>");
username = username.ToLower();

“numberOfMessages” är antal Twitter statusar vi vill visa, det går att visa mellan 0-20 stycken. “username” är alltså vårat användarnamn på Twitter. “splitUserNameAndLink” kommer jag till längre ner. Vi behöver inkludera namespacet “System.Xml.Linq” för att funktionen nedan ska fungera.

public static List<Twitter> FetchTwitterStatus(string username, int numberOfMessages)
{

string user = username;
var messages = new List<Twitter>();
string url = "http://twitter.com/statuses/user_timeline/" + user + ".rss";
try
{
var doc = XElement.Load(url);
var children = (from item in doc.Element("channel").Elements("item") select item).Take(numberOfMessages);

foreach (XElement elm in children)
{
Twitter tw = new Twitter();
tw.Status = elm.Element("description").Value;
tw.DateDiff = DateTime.Parse(elm.Element("pubDate").Value).ToLongDateString();
tw.Link = elm.Element("link").Value;
messages.Add(tw);
}
}
catch (Exception)
{
throw new ArgumentException("No twitter rss");
}
return messages;
}
public class Twitter
{
      public string Status { get; set; }
public string Link { get; set; }
public string DateDiff { get; set; }
}

Nu blev det mycket kod. Vi har alltså skapat en List<T> funktion, där <T> är klassen Twitter. Vi har våran “username” sträng från tidigare och “numberOfMessages”. Längre ner i kodstycket har vi en try {…}. Där vi laddar in våran xml fil, alltså Twitter rss. Med hjälp av Linq to XML så tar vi oss in en bit i xml upplägget och sen kan vi börja plocka ut det vi vill ha. I “foreache” loopen så plockar vi ut statusen, datumet och länken och lägger sedan till i våran “messages” lista som skapades tidigare.

Skulle den inte finna användaren eller något annat dyker upp. Så får vi ett fel “No twitter rss”. Då brukar det vara något fel på användarnamnet eller så är det något problem hos Twitter (vilket inte händer så ofta). Men skulle vi inte få något fel så returnar vi “messages” och får alltså ut det antal statusar vi vill.

Nu kan vi bygga klart våran funktion som vi höll på med.

     foreach (var item in FetchTwitterStatus(username, numberOfMessages))
{
if (splitUserNameAndLink)
{
string splitStatus = item.Status.Remove(0, username.Length + 1);
string userName = item.Status.Remove(username.Length + 1, splitStatus.Length);

sb.AppendLine(String.Format("<li>{0} <a href=\"{1}\">{2}</a> - {3}</li>", userName, item.Link, splitStatus, item.DateDiff));
}
else
{
sb.AppendLine(String.Format("<li><a href=\"{0}\">{1}</a> - {2}</li>", item.Link, item.Status, item.DateDiff));
}
}

sb.AppendLine("</ul>");

return sb.ToString();
}

Nu så kan vi komma tillbaks till “splitUserNameLink”, om den sätts till “true” så har jag gjort så att den tar bort användarnamnet från länken och skriver det före länken, Användarnamn: Länken till min status – datumet. Annars om den sätts till “false” så blir allt förutom datumet en länk till den statusen. När vi sedan har plockat ut allt från “FetchTwitterStatus” så kan vi returnar våran TwitterStatus HtmlHelper.

För att visa detta nu så lägger vi till “Import Namespace=”DittProjekt.Helpers””. För att sedan kunna skriva ut detta.

<%= Html.TwitterStatus(5, "användarnamn", true) %>

Där 5 är ett nummer mellan 0-20. Nu bör vi få ett resultat liknande detta:

Med “splitUserNameAndLink” satt till “true”

twitter-1-20100113

Med “splitUserNameAndLink” satt till “false”

twitter-2-20100113

Jag kommer göra en efterföljare på detta inlägg, där jag kommer ta upp mer om hur man kan arbeta med flera användarkonton och hur man gör det lättare att styra layouten.

3 Comments

Comments have been disabled for this content.