# HG changeset patch # User nelopauselli # Date 1317246713 10800 # Node ID 9f61e85551147ed7d71c8906ad59e2c8959a0ff7 # Parent 11545cc9549159aa1b92f95f6e9e9643eae30428 Nombrando a todos los ponentes en los twitter y partiendo los mensajes que superan el máximo permitido diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs --- 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(); + + string message; + var twitters= new List(); + adapter.Setup(a => a.Update(It.IsAny(), out message)).Returns(true).Callback((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(), out message), Times.Exactly(2)); + + } } } \ No newline at end of file diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter/ITwitterWriter.cs --- 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 diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs --- 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 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 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 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 diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter/Writers/AgendarTwitterWriter.cs --- 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 diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter/Writers/ConfirmarTwitterWriter.cs --- 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}; } } } diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter/Writers/ProponerTwitterWriter.cs --- 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 diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter/Writers/PublicarTwitterWriter.cs --- 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 diff -r 11545cc95491 -r 9f61e8555114 Agendas/trunk/src/Agendas.Twitter/Writers/TwitterHelper.cs --- 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 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;