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();
}
}
} |