view Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs @ 120:c3573defd18f

Agregado de Fecha, Usuario y Successful en TrackLog Modificacion de publicador de blog para usar TrackLog Agregado de TrackLog en el test de crud de eventos Fix en publicador de twitter para que no twitee si ya se encuentra en TrackLog pero con Successful en true
author Jorge@Jorge-PC
date Fri, 24 Jun 2011 21:18:21 -0300
parents 90ce239cfa6d
children 17531db40d4e
line wrap: on
line source

using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using AltNetHispano.Agendas.Domain;
using Twitterizer;

namespace AltNetHispano.Agendas.Twitter
{
	public class TwitterPublicador : IPublicador
	{
		private readonly ITwitterAdapter _twitterAdapter;

		public TwitterPublicador()
		{
			_twitterAdapter = new TwitterAdapter();
		}

		public TwitterPublicador(ITwitterAdapter twitterAdapter)
		{
			_twitterAdapter = twitterAdapter;
		}

		public const int LIMITE_MENSAJE = 140;

		private string ConsumerKey
		{
			get { return ConfigurationManager.AppSettings["consumerKeyAppTwitt"]; }
		}

		private string ConsumerSecret
		{
			get { return ConfigurationManager.AppSettings["consumerSecretAppTwitt"]; }
		}


		private string AccessToken
		{
			get { return ConfigurationManager.AppSettings["accessTokenAppTwitt"]; }
		}


		private string AccessTokenSecret
		{
			get { return ConfigurationManager.AppSettings["accessTokenSecretAppTwitt"]; }
		}

		public void Publicar(IEnumerable<Track> tracks)
		{
			foreach (var track in tracks)
			{
				//Si ya hicimos el twitt de este track, no volvemos a hacerlo
				if (track.Logs.Any(l => l.Propietario == TrackLogPropietario.Twitter && l.Successful)) continue;

				var twitt = BuildTwitt(track);
				if (!string.IsNullOrWhiteSpace(twitt))
				{
					string message;
					bool success = Publicar(twitt, out message);
					track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, message, track.Usuario, success));
				}
			}
		}

		private static string BuildTwitt(Track track)
		{
			string body = string.Empty;
			switch (track.Accion)
			{
				case Accion.Proponer:
					body = "Se ha propuesto un/a nuevo/a " + track.Evento.Tipo;
					break;
				case Accion.Agendar:
					body = "Se ha agendando el evento" + track.Evento.Titulo;
					if (track.Evento.Ponente.Twitter != null)
						body += " con @" + track.Evento.Ponente.Twitter;
					break;
				case Accion.Confirmar:
					if (track.Evento.Fecha.HasValue)
						body = "Se confirma para el " + track.Evento.Fecha.Value.ToShortDateString() + " el evento " + track.Evento.Titulo;
					break;
			}

			return body.Length > LIMITE_MENSAJE ? body.Substring(0, LIMITE_MENSAJE - 1) : body;
		}

		public bool Publicar(string status, out string message)
		{
			var tokens = new OAuthTokens
							{
								ConsumerKey = ConsumerKey,
								ConsumerSecret = ConsumerSecret,
								AccessToken = AccessToken,
								AccessTokenSecret = AccessTokenSecret
							};

			var response = _twitterAdapter.UpdateStatus(tokens, status);

			message = response.ErrorMessage;
			return response.Result == RequestResult.Success;
		}
	}
}