view Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs @ 298:9bc60d166c8a

Se corrigieron los tests por el cambio de Patrocinador, para que no persista el logo en disco. Se comentó el código de PatrocinadorApiController, que no se utiliza.
author juanjose.montesdeocaarbos
date Sun, 19 Feb 2012 16:00:38 -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();
		}
	}
}