changeset 228:9f61e8555114

Nombrando a todos los ponentes en los twitter y partiendo los mensajes que superan el máximo permitido
author nelopauselli
date Wed, 28 Sep 2011 18:51:53 -0300
parents 11545cc95491
children 33976aea7546
files Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs Agendas/trunk/src/Agendas.Twitter/ITwitterWriter.cs Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs Agendas/trunk/src/Agendas.Twitter/Writers/AgendarTwitterWriter.cs Agendas/trunk/src/Agendas.Twitter/Writers/ConfirmarTwitterWriter.cs Agendas/trunk/src/Agendas.Twitter/Writers/ProponerTwitterWriter.cs Agendas/trunk/src/Agendas.Twitter/Writers/PublicarTwitterWriter.cs Agendas/trunk/src/Agendas.Twitter/Writers/TwitterHelper.cs
diffstat 8 files changed, 138 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -1,4 +1,6 @@
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Tests;
 using AltNetHispano.Agendas.Twitter;
@@ -56,5 +58,49 @@
 			Assert.That(twitt, Is.StringContaining("@nelopauselli"));
 
 		}
+
+		[Test]
+		public void Twitter_texto_largo()
+		{
+			var adapter = new Mock<ITwitterAdapter>();
+
+			string message;
+			var twitters= new List<string>();
+			adapter.Setup(a => a.Update(It.IsAny<string>(), out message)).Returns(true).Callback<string, string>((status, m) => twitters.Add(status));
+
+			var publicador = new TwitterPublicador(adapter.Object);
+			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository);
+
+			var ponente = new Persona("Carlos Peix", "carlospeix@gmail.com", "carlospeix", "http://www.carlospeix.com.ar");
+			DefaultPersonaRepository.Save(ponente);
+
+			var otrosPonentes = new Persona("Nelo Pauselli", "nelopauselli@gmail.com", "nelopauselli",
+			                                "http://nelopauselli.blogspot.com/");
+			DefaultPersonaRepository.Save(otrosPonentes);
+
+			var inicio = DateTime.Now.AddDays(3);
+
+			agenda.Agendar("Identity Providers Públicos y Empresariales", ponente.Id, inicio, inicio.AddHours(2), null, TipoEvento.Van,
+			               new[] {otrosPonentes.Id});
+
+			Assert.IsTrue(twitters.Any());
+			var joined = string.Empty;
+			foreach (var twitter in twitters)
+			{
+				Console.WriteLine(twitter);
+				Assert.LessOrEqual(twitter.Length, 140);
+				joined += twitter;
+			}
+			Assert.That(joined, Is.StringContaining("Identity Providers Públicos y Empresariales"));
+			Assert.That(joined, Is.StringContaining("@carlospeix"));
+			Assert.That(joined, Is.StringContaining("@nelopauselli"));
+
+			Assert.AreEqual(2, twitters.Count());
+			Assert.AreEqual("Se ha agendando el evento Identity Providers Públicos y Empresariales con @carlospeix, @nelopauselli para el 01/10/2011...", twitters.First());
+			Assert.AreEqual("...por http://snipr.com/virtualaltnet", twitters.Last());
+
+			adapter.Verify(a => a.Update(It.IsAny<string>(), out message), Times.Exactly(2));
+
+		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/ITwitterWriter.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/ITwitterWriter.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -4,6 +4,6 @@
 {
 	public interface ITwitterWriter
 	{
-		string Write(Track track);
+		string[] Write(Track track);
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -30,7 +30,7 @@
 			_twitterAdapter = twitterAdapter;
 		}
 
-		private const int LIMITE_MENSAJE = 140;
+		private const int LIMITE_MENSAJE = 134;
 
 		public void Publicar(IEnumerable<Track> tracks)
 		{
@@ -42,12 +42,19 @@
 				if (track.Logs.Any(l => l.Propietario == TrackLogPropietario.Twitter && l.Successful)) continue;
 
 				var twitt = BuildTwitt(track);
-				if (!string.IsNullOrWhiteSpace(twitt))
+				if (twitt.Length>0)
 				{
 					try
 					{
-						string message;
-						bool success = _twitterAdapter.Update(twitt, out message);
+						bool success=true;
+						string 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)
@@ -58,15 +65,43 @@
 			}
 		}
 
-		private string BuildTwitt(Track track)
+		private string[] BuildTwitt(Track track)
 		{
 			ITwitterWriter writer;
 			if (!_writers.TryGetValue(track.Accion, out writer))
-				return string.Empty;
+				return new[] {string.Empty};
+
+			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];
 
-			string body = writer.Write(track);
+				var nuevo = twitter + parte;
+				if (nuevo.Length < LIMITE_MENSAJE)
+					twitter = nuevo;
+				else
+				{
+					if (index<parte.Length-1)
+						twitter += "...";
+					if (twitters.Any())
+						twitter = "..." + twitter;
 
-			return body.Length > LIMITE_MENSAJE ? body.Substring(0, LIMITE_MENSAJE - 1) : body;
+					twitters.Add(twitter);
+					twitter = parte.Trim();
+				}
+			}
+			if (!string.IsNullOrWhiteSpace(twitter))
+			{
+				if (twitters.Any())
+					twitter = "..." + twitter;
+				twitters.Add(twitter);
+			}
+
+			return twitters.ToArray();
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/Writers/AgendarTwitterWriter.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Writers/AgendarTwitterWriter.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -1,19 +1,22 @@
-using System;
-using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Domain;
 
 namespace AltNetHispano.Agendas.Twitter.Writers
 {
 	public class AgendarTwitterWriter : ITwitterWriter
 	{
-		public string Write(Track track)
+		public string[] Write(Track track)
 		{
-			var body = "Se ha agendando el evento " + track.Evento.Titulo;
-			
-			body += " con " + TwitterHelper.GetPonente(track.Evento.Ponente);
+			return new[]
+			       	{
+			       		"Se ha agendando el evento " + track.Evento.Titulo,
+			       		" con " + TwitterHelper.GetPonentes(track.Evento.Ponentes),
+			       		track.Evento.FechaInicio.HasValue
+			       			? " para el " + track.Evento.FechaInicio.Value.ToShortDateString()
+			       			: string.Empty,
+			       		" por http://snipr.com/virtualaltnet"
+			       	};
 
-			if (track.Evento.FechaInicio.HasValue)
-				body += " para el " + track.Evento.FechaInicio.Value.ToShortDateString();
-			return body;
+
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/Writers/ConfirmarTwitterWriter.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Writers/ConfirmarTwitterWriter.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -4,13 +4,17 @@
 {
 	public class ConfirmarTwitterWriter : ITwitterWriter
 	{
-		public string Write(Track track)
+		public string[] Write(Track track)
 		{
 			{
 				if (track.Evento.FechaInicio.HasValue)
-					return "Se confirma para el " + track.Evento.FechaInicio.Value.ToShortDateString() + " el evento " + track.Evento.Titulo +
-						   " con " + TwitterHelper.GetPonente(track.Evento.Ponente);
-				return string.Empty;
+					return new[]
+					       	{
+					       		"Se confirma para el " + track.Evento.FechaInicio.Value.ToShortDateString(),
+					       		" el evento " + track.Evento.Titulo,
+					       		" con " + TwitterHelper.GetPonentes(track.Evento.Ponentes)
+					       	};
+				return new[] {string.Empty};
 			}
 		}
 	}
--- a/Agendas/trunk/src/Agendas.Twitter/Writers/ProponerTwitterWriter.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Writers/ProponerTwitterWriter.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -4,10 +4,10 @@
 {
 	public class ProponerTwitterWriter : ITwitterWriter
 	{
-		public string Write(Track track)
+		public string[] Write(Track track)
 		{
 			var sust = track.Evento.Tipo == TipoEvento.Van ? "una nueva VAN" : "un nuevo " + track.Evento.Tipo;
-			return "Se ha propuesto " + sust + " sobre " + track.Evento.Titulo;
+			return new[] {"Se ha propuesto " + sust, " sobre " + track.Evento.Titulo};
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/Writers/PublicarTwitterWriter.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Writers/PublicarTwitterWriter.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -4,9 +4,13 @@
 {
 	public class PublicarTwitterWriter : ITwitterWriter
 	{
-		public string Write(Track track)
+		public string[] Write(Track track)
 		{
-			return "Se ha publicado el video del evento " + track.Evento.Titulo + " con " + TwitterHelper.GetPonente(track.Evento.Ponente);
+			return new[]
+			       	{
+			       		"Se ha publicado el video del evento " + track.Evento.Titulo,
+			       		" con " + TwitterHelper.GetPonentes(track.Evento.Ponentes)
+			       	};
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/Writers/TwitterHelper.cs	Wed Sep 28 08:57:34 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Writers/TwitterHelper.cs	Wed Sep 28 18:51:53 2011 -0300
@@ -1,10 +1,28 @@
-using AltNetHispano.Agendas.Domain;
+using System.Collections.Generic;
+using System.Linq;
+using AltNetHispano.Agendas.Domain;
 
 namespace AltNetHispano.Agendas.Twitter.Writers
 {
 	public static class TwitterHelper
 	{
-		public static string GetPonente(Persona ponente)
+		public static string GetPonentes(IEnumerable<Persona> ponentes)
+		{
+			var nombres = ponentes.Select(GetPonente).ToArray();
+			string texto = string.Empty;
+			for (int i = 0; i < nombres.Length; i++)
+			{
+				var nombre = nombres[i];
+				if (i == nombre.Length-1)
+					texto += " y ";
+				else if (i != 0)
+					texto += ", ";
+				texto += nombre;
+			}
+			return texto;
+		}
+
+		private static string GetPonente(Persona ponente)
 		{
 			if (!string.IsNullOrWhiteSpace(ponente.Twitter))
 				return "@" + ponente.Twitter;