Справка TeamWoxЧатПубличная частьПример .NET

Пример публичной части на .NET

В данном разделе приводится расширенный пример оформления публичной части модуля "Чат" с использованием языка .NET. Данный пример включает в себя реализацию дополнительной возможности получения информации о присутствии сотрудников онлайн в группах обслуживания.

Для работы данного кода в проекте Visual Studio необходимо добавить ссылки (References) на библиотеку "System.Web.Extensions".

Пояснения к примеру

В следующей строке примера указывается адрес, на который будут посылаться запросы:

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

Необходимо заменить адрес "http://your.domain.com/" на адрес вашей системы TeamWox. Внутренняя страница TeamWox, к которой обращается код, указывается в следующей строке:

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

Обращение происходит к странице /public/chat/group, результат возвращается в формате JSON. Именно с этой страницы запрашивается список доступных групп обслуживания, а также их статус онлайн/оффлайн.

Полный код

Ниже приведен полный код реализации публичной части:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
//---
namespace SendRequestChatOnline
{
  /// <summary>
  /// Данные о каждой группе, с указанием статуса и названия
  /// </summary>
  class ChatGroup
    {
    public string ID { get; set; }
    public bool OnLine { get; set; }
    public string Name { get; set; }
    }
  /// <summary>
  /// Класс для получения данных о всех группах и их статус
  /// </summary>
  class StatusGroups
    {
    public int Config { get; set; }
    public List<ChatGroup> Groups { get; set; }
    }
  /// <summary>
  /// Конвертация данных из строкого json в объект 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>
    /// Десериализация полученных данный в нужный объект
    /// </summary>
    /// <param name="dictionary">пришедшие данные</param>
    /// <param name="type">тип данных</param>
    /// <param name="serializer">класс серелизатора</param>
    /// <returns>заполненный класс StatusGroups, либо 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)   //--- список доступных групп
                           };
      //---
      return obj;
      }
    /// <summary>
    /// Парсер для групп
    /// </summary>
    /// <param name="listGroups">список групп</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 группы
                         Name = (string)dictionary["name"],       //--- имя группы
                         OnLine = (int)dictionary["online"] == 1  //--- статус группы
                       });
        }
      //---
      return resultItems;
      }
    /// <summary>
    /// Заглушка для сериализации. Не используется
    /// </summary>
    public override IDictionary<string,object> Serialize(object obj,JavaScriptSerializer serializer)
      {
      return null;
      }
    }
  /// <summary>
  /// Класс для работы с данными групп и их статусами
  /// </summary>
  class TeamWoxChatGroups
    {
    private readonly string m_TeamwoxURLGetChatGroup;
    public TeamWoxChatGroups(string serverHost)
      {
      m_TeamwoxURLGetChatGroup = serverHost + "public/chat/groups?json";
      }
    /// <summary>
    /// Отправка http запроса
    /// </summary>
    private static string OpenUrlGet(string url)
      {
      HttpWebRequest request =  (HttpWebRequest)WebRequest.Create(url);
      request.Method = "GET";
      request.Headers.Add("UserAgent","Web-site");
      //--- заполняем данные для отправки на 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>
    /// Получение данных из json
    /// </summary>
    /// <param name="json">строка в формате json</param>
    /// <returns>объект с данными о группах</returns>
    private static StatusGroups ParsingStringJson(string json)
      {
      JavaScriptSerializer serializer = new JavaScriptSerializer();
      serializer.RegisterConverters(new List<JavaScriptConverter> { new StatusGroupConverter() });
      return serializer.Deserialize<StatusGroups>(json);
      }
    /// <summary>
    /// Получение данных обо всех группах и их статусах
    /// </summary>
    /// <returns></returns>
    public StatusGroups QueryGetChatGroup()
      {
      string stringJson = OpenUrlGet(m_TeamwoxURLGetChatGroup);
      //---
      return ParsingStringJson(stringJson);
      }
    }
  /// <summary>
  /// Основной класс для вызова консольной программы
  /// </summary>
  class Program
    {
    static void Main()
      {
      //--- создание основного класса
      TeamWoxChatGroups groups = new TeamWoxChatGroups("http://your.domain.com/");
      //--- получение данных о группах
      StatusGroups statusGroups = groups.QueryGetChatGroup();
      //--- отображение данных о группах
      if(statusGroups != null && statusGroups.Groups != null)
        {
        foreach(ChatGroup chatGroup in statusGroups.Groups)
          {
          Console.WriteLine(chatGroup.Name + " " + (chatGroup.OnLine ? " On line" : "Off line"));
          }
        }
      Console.ReadLine();
      }
    }
  }