view Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs @ 291:5f1e3d35e113

Patrocinadores: Correcciones en Vistas.
author juanjose.montesdeocaarbos
date Thu, 09 Feb 2012 00:12:00 -0300
parents 33e6ee3d1776
children
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.Linq;
using AltNetHispano.Agendas.Configurations;
using AltNetHispano.Agendas.Domain;
using AltNetHispano.Agendas.Twitter.Writers;

namespace AltNetHispano.Agendas.Twitter
{
	public class TwitterPublicador : IPublicador
	{
		private readonly IDictionary<Accion, ITwitterWriter> _writers;
		private readonly ITwitterAdapter _twitterAdapter;

		public TwitterPublicador()
			: this(new TwitterAdapter())
		{
		}

		public TwitterPublicador(ITwitterAdapter twitterAdapter)
		{
			_writers = new Dictionary<Accion, ITwitterWriter>
			            	{
			            		{Accion.Proponer, new ProponerTwitterWriter()},
			            		{Accion.Agendar, new AgendarTwitterWriter()},
			            		{Accion.Confirmar, new ConfirmarTwitterWriter()},
			            		{Accion.Publicar, new PublicarTwitterWriter()}
			            	};

			_twitterAdapter = twitterAdapter;
		}

		private const int LIMITE_MENSAJE = 134;

		public void Publicar(IEnumerable<Track> tracks)
		{
			if (!AgendasConfigurationManager.Publicadores.Twitter.Enabled) return;

			foreach (var track in tracks)
			{
				if (track.Evento.FechaInicio < DateTime.Today || track.Evento.FechaTermino < DateTime.Today)
				{
					var message = string.Empty;

					message = "Solo se generan twitts de eventos futuros.";

					track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, message, track.Usuario, false));
				}
				else
				{
					//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 (twitt.Length > 0)
					{
						try
						{
							var success = true;
							var message = string.Empty;

							foreach (var t in twitt)
							{
								string m;
								success &= _twitterAdapter.Update(t, out m);
								message += m;
							}
							track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, message, track.Usuario, success));
						}
						catch (Exception ex)
						{
							track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, track.Usuario, ex));
						}
					}
				}
			}
		}

		private string[] BuildTwitt(Track track)
		{
			ITwitterWriter writer;
			if (!_writers.TryGetValue(track.Accion, out writer))
				return new string[0];

			var partes = writer.Write(track).Where(t => !string.IsNullOrWhiteSpace(t)).ToArray();

			var twitters = new List<string>();

			string twitter = string.Empty;
			for (int index = 0; index < partes.Length; index++)
			{
				string parte = partes[index];

				var nuevo = twitter + parte;
				if (nuevo.Length < LIMITE_MENSAJE)
					twitter = nuevo;
				else
				{
					if (index<parte.Length-1)
						twitter += "...";
					if (twitters.Any())
						twitter = "..." + twitter;

					twitters.Add(twitter);
					twitter = parte.Trim();
				}
			}
			if (!string.IsNullOrWhiteSpace(twitter))
			{
				if (twitters.Any())
					twitter = "..." + twitter;
				twitters.Add(twitter);
			}

			return twitters.ToArray();
		}
	}
}