Ejemplo de la parte pública en .NET

En este apartado se muestra un ejemplo ampliado de implementación de la parte pública del módulo "Chat" con el uso del lenguaje .NET. Este ejemplo incluye la implementación de posibilidades adicionales para obtener la información sobre la presencia de los empleados en línea en los grupos de servicio.

Para el funcionamiento de este código hay que añadir las referencias (References) a la biblioteca "System.Web.Extensions" en el proyecto de Visual Studio.

Comentarios sobre el ejemplo

En la siguiente fila del ejemplo se pone la dirección a la que van a mandar las solicitudes:

TeamWoxChatGroups groups = new TeamWoxChatGroups("http://your.domain.com/");

Tendrá que sustituir la dirección "http://your.domain.com/" por la dirección de su sistema TeamWox. La página interna de TeamWox a la que se dirige el código se especifica en la siguiente fila:

m_TeamwoxURLGetChatGroup = serverHost + "public/chat/groups?json";

Se llama a la página /public/chat/group y el resultado se devuelve en el formato JSON. Precisamente desde esta página se solicita la lista de grupos de servicio disponibles, así como su estatus en línea/fuera de línea.

Código completo

Más abajo se muestra el código completo de implementación del componente público:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
//---
namespace SendRequestChatOnline
  {
  /// <summary>
  /// Datos sobre cada grupo indicando su estatus y nombre
  /// </summary>
  class ChatGroup
    {
    public string ID { get; set; }
    public bool OnLine { get; set; }
    public string Name { get; set; }
    }
  /// <summary>
  /// Clase para recibir datos sobre todos los grupos y sobre su estatus
  /// </summary>
  class StatusGroups
    {
    public int Config { get; set; }
    public List<ChatGroup> Groups { get; set; }
    }
  /// <summary>
  /// Conversión de datos desde la cadena json al objeto StatusGroups
  /// </summary>
  public class StatusGroupConverter : JavaScriptConverter
    {
    private static readonly Type[] m_SupportedTypes = new[] { typeof(StatusGroups) };
    public override IEnumerable<Type> SupportedTypes { get { return m_SupportedTypes; } }
    /// <summary>
    /// Deserialización de datos obtenidos en el objeto necesario
    /// </summary>
    /// <param name="dictionary">datos llegados</param>
    /// <param name="type">tipo de datos</param>
    /// <param name="serializer">clase del serializador</param>
    /// <returns>clase llenado StatusGroups, o null</returns>
    public override object Deserialize(IDictionary<string,object> dictionary,
                                        Type type,
                                        JavaScriptSerializer serializer)
      {
      StatusGroups obj = new StatusGroups
                           {
                             Config = (int)dictionary["config"],                         //--- id
                             Groups = ParsingGroups(dictionary["groups"] as ArrayList)   //--- lista de grupos disponibles
                           };
      //---
      return obj;
      }
    /// <summary>
    /// Analizador sintáctico para grupos
    /// </summary>
    /// <param name="listGroups">lista de grupos</param>
    /// <returns></returns>
    private static List<ChatGroup> ParsingGroups(ArrayList listGroups)
      {
      List<ChatGroup> resultItems = new List<ChatGroup>();
      //---
      foreach(IDictionary<string,object> dictionary in listGroups)
        {
        if(dictionary == null)
          continue;
        //---
        resultItems.Add(new ChatGroup
                       {
                         ID = (string)dictionary["id"],           //--- id del grupo
                         Name = (string)dictionary["name"],       //--- nombre del grupo
                         OnLine = (int)dictionary["online"] == 1  //--- estatus del grupo
                       });
        }
      //---
      return resultItems;
      }
    /// <summary>
    /// Tapón para serialización. No se usa
    /// </summary>
    public override IDictionary<string,object> Serialize(object obj,JavaScriptSerializer serializer)
      {
      return null;
      }
    }
  /// <summary>
  /// Clase para trabajar con los datos de los grupos y sus estatus
  /// </summary>
  class TeamWoxChatGroups
    {
    private readonly string m_TeamwoxURLGetChatGroup;
    public TeamWoxChatGroups(string serverHost)
      {
      m_TeamwoxURLGetChatGroup = serverHost + "public/chat/groups?json";
      }
    /// <summary>
    /// Envío de la solicitud http
    /// </summary>
    private static string OpenUrlGet(string url)
      {
      HttpWebRequest request =  (HttpWebRequest)WebRequest.Create(url);
      request.Method = "GET";
      request.Headers.Add("UserAgent","Web-site");
      //--- llenamos datos para enviar al servidor TeamWox
      request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
      request.AllowAutoRedirect = false;
      request.KeepAlive = false;
      //--- make request
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();
      Stream responseStream = response.GetResponseStream();
      StreamReader reader = new StreamReader(responseStream);
      string result = reader.ReadToEnd();
      reader.Dispose();
      //---
      response.Close();
      responseStream.Dispose();
      //---
      return result;
      }
    /// <summary>
    /// Recepción de datos desde json
    /// </summary>
    /// <param name="json">cadena en el formato json</param>
    /// <returns>objeto con los datos sobre los grupos</returns>
    private static StatusGroups ParsingStringJson(string json)
      {
      JavaScriptSerializer serializer = new JavaScriptSerializer();
      serializer.RegisterConverters(new List<JavaScriptConverter> { new StatusGroupConverter() });
      return serializer.Deserialize<StatusGroups>(json);
      }
    /// <summary>
    /// Recepción de la información sobre todos los grupos y sus estatus
    /// </summary>
    /// <returns></returns>
    public StatusGroups QueryGetChatGroup()
      {
      string stringJson = OpenUrlGet(m_TeamwoxURLGetChatGroup);
      //---
      return ParsingStringJson(stringJson);
      }
    }
  /// <summary>
  /// Clase principal para llamar a la aplicación de consola
  /// </summary>
  class Program
    {
    static void Main()
      {
      //--- creación de clase principal
      TeamWoxChatGroups groups = new TeamWoxChatGroups("http://your.domain.com/");
      //--- obtención de la información sobre los grupos
      StatusGroups statusGroups = groups.QueryGetChatGroup();
      //--- visualización de la información sobre los grupos
      if(statusGroups != null && statusGroups.Groups != null)
        {
        foreach(ChatGroup chatGroup in statusGroups.Groups)
          {
          Console.WriteLine(chatGroup.Name + " " + (chatGroup.OnLine ? " On line" : "Off line"));
          }
        }
      Console.ReadLine();
      }
    }
  }