ok, tylko jak to poprawić?
tutaj dodaję kod shgg, z którego ja korzystam:
/* SHGG.cs
Copyright (c) HAKGERSoft 2000 - 2009 www.hakger.xorg.pl
This unit is owned by HAKGERSoft, any modifications without HAKGERSoft permission
are prohibited!
Authors:
* DetoX [ reedi(at)poczta(dot)fm ]
* mlesniew
* Jacek Trublajewicz 'jotte' [ gothic(at)os(dot)pl ]
Unit description:
.NET GG engine based on System.Net.Sockets.TcpClient,
Requirements:
.NET 3.5 (at least) to develop
Version:
0.652 / 25.01.2008
Remarks:
Check new version at http://code.google.com/p/shgg
*/
using System;
using System.Linq;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.Drawing;
using System.Net.Sockets;
namespace HAKGERSoft {
/// <summary>
/// Główna klasa obsługująca silnik klienta gadu-gadu
/// </summary>
public sealed partial class sHGG {
TcpClient TcpEngine = null;
Thread IdleEngine, pingTimer;
NetworkStream NetStream;
SynchronizationContext Sync = SynchronizationContext.Current;
internal bool mock {
get { return this.mockObj != null; }
}
internal ConnectionMock mockObj;
/// <summary>
/// Lista kontaktów
/// </summary>
public GGUsers Users;
# region Properties
/// <summary>
/// <value>Określa adres IP serwera gadu-gadu</value>
/// </summary>
public string GGServerAddress {
get { return vGGServerAddress; }
set { vGGServerAddress = value; }
}
private string vGGServerAddress = DEFAULT_GG_HOST;
/// <summary>
/// <value>Określa numer gadu-gadu klienta (twój numer GG)</value>
/// </summary>
public string GGNumber {
get { return vGGNumber; }
set { vGGNumber = value; }
}
private string vGGNumber = "0";
/// <summary>
/// <value>Określa hasło klienta gadu-gadu (twoje hasło)</value>
/// </summary>
public string GGPassword {
get { return vGGPassword; }
set { vGGPassword = value; }
}
private string vGGPassword = string.Empty;
/// <summary>
/// <value>Określa status gadu-gadu</value>
/// </summary>
public GGStatusType GGStatus {
get { return vGGStatus; }
set {
vGGStatus = value;
if (this.IsGGLogged || this.mock)
this.OutStatus();
}
}
private GGStatusType vGGStatus = GGStatusType.NotAvailable;
/// <summary>
/// <value>Określa opis klienta gadu-gadu</value>
/// </summary>
public string GGDescription {
get { return vGGDescription; }
set {
vGGDescription = value;
if (vGGDescription.Length > MAX_DESCRIPTIONS_SIZE)
vGGDescription = vGGDescription.Substring(0, MAX_DESCRIPTIONS_SIZE);
if (this.IsGGLogged || this.mock)
GGStatus = vGGStatus;
}
}
private string vGGDescription = string.Empty;
/// <summary>
/// <vale>Jeśli właściwość ma wartość TRUE to włączony jest
/// tryb "Pokazuj status tylko znajomym"</vale>
/// </summary>
public bool GGFriendsMask {
get { return vGGFriendsMask; }
set {
vGGFriendsMask = value;
if (this.IsGGLogged || this.mock)
GGStatus = vGGStatus;
}
}
private bool vGGFriendsMask = false;
/// <summary>
/// <value>Pozwala określić maksymalną wielkość obrazka</value>
/// </summary>
public byte GGImageSize {
get { return vGGImageSize; }
set { vGGImageSize = value; } // todo: re login?
}
private byte vGGImageSize = (byte)255;
/// <summary>
/// <value>Właściwość jednoznacznie określa czy klient jest zalogowany
/// w danej chwili do serwera gadu-gadu (tylko do odczytu)</value>
/// </summary>
public bool IsGGLogged {
get { return vIsGGLogged; }
private set { vIsGGLogged = value; }
}
private bool vIsGGLogged = false;
/// <summary>
/// Właściwość określa czy można szukać dalej w katalogu publicznym (tylko do odczytu)
/// </summary>
public bool PubDirCanSearchMore {
get { return vNextStart != 0; }
}
# endregion
# region Events
public delegate void GenericEventHandler<A>(object sender, A args);
/// <summary>
/// Zdarzenie wykonuje się w memencie zalogowania do serwera
/// </summary>
public event GenericEventHandler<EventArgs> GGLogged;
/// <summary>
/// Zdarzenie wykonuje się w przypadku nieudanej próby zalogowania do serwera
/// </summary>
public event GenericEventHandler<EventArgs> GGLogFailed;
/// <summary>
/// Zdarzenie wykonuje się w przypadku, gdy serwer gadu-gadu rozłączy klienta
/// </summary>
public event GenericEventHandler<EventArgs> GGDisconnected;
/// <summary>
/// Zdarzenie wykonuje się gdy przyszła nowa wiadomość
/// </summary>
public event GenericEventHandler<MessageReceiveEventArgs> GGMessageReceive;
public class MessageReceiveEventArgs : EventArgs {
/// <summary>
/// numer GG nadawcy wiadomości
/// </summary>
public int Number;
/// <summary>
/// treść wiadomości
/// </summary>
public string Message;
/// <summary>
/// czas wysłania wiadomości
/// </summary>
public DateTime Time;
}
/// <summary>
/// Zdarzenie informuje o wynikach szukania osób w katalogu publicznym
/// </summary>
public event GenericEventHandler<SearchReplyEventArgs> GGSearchReply;
public class SearchReplyEventArgs : EventArgs {
/// <summary>
/// znalezione osoby
/// </summary>
public List<GGUser> Users;
}
/// <summary>
/// Zdarzenie wykonuje się gdy odczytano własne informacje w katalogu publicznym
/// </summary>
public event GenericEventHandler<PubDirReadReplyEventArgs> GGPubDirReadReply;
public class PubDirReadReplyEventArgs : EventArgs {
/// <summary>
/// własne informacje w katalogu publicznym
/// </summary>
public GGUser User;
}
///// <summary>
///// Zdarzenie wykonuje się w przypadku pomyślnego zapisania danych w katalogu publicznym
///// </summary>
//public event GenericEventHandler<EventArgs> GGPubDirWriteReply;
# endregion
/// <summary>
/// Konstruktor klasy sHGG
/// </summary>
public sHGG(): base() {
Sync = Sync ?? new SynchronizationContext();
this.Users = new GGUsers(this);
}
internal sHGG(ConnectionMock mockObj): this() {
this.mockObj = mockObj;
}
/// <summary>
/// Loguje się do serwera gadu-gadu (domyślny adres serwera GG)
/// </summary>
public void GGLogin() {
GGLogin(GGServerAddress);
}
/// <summary>
/// Loguje się do serwera gadu-gadu (dowolny adres serwera GG)
/// </summary>
/// <param name="serverAddress"></param>
public void GGLogin(string serverAddress) {
OutConnect(serverAddress);
}
/// <summary>
/// Metoda wylogowuje z serwera gadu-gadu (rozłącza)
/// </summary>
public void GGLogout() {
if (this.IsGGLogged) {
StopIdleEngine();
StopPing();
TcpEngine.Close();
IsGGLogged = false;
NetStream.Close();
this.Users.UsersRestart();
}
}
/// <summary>
/// Funkcja zwraca aktualnie czynny adres IP serwera gadu-gadu lub pusty
/// string w przypadku, gdy żaden nie jest dostępny juz operacja nie
/// powiedzie się
/// </summary>
/// <returns>adres IP serwera</returns>
public string GGGetActiveServer() {
return HttpGGGetActiveServer() ?? string.Empty;
}
/// <summary>
/// Funkcja generuje token gadu-gadu
/// </summary>
/// <param name="tokenId">id (numer) tokenu</param>
/// <param name="tokenUrl">pełen adres tokenu</param>
/// <returns>obrazek z tokenem</returns>
public Image GGGetToken(out string tokenId, out string tokenUrl) {
return HttpGetToken(out tokenId, out tokenUrl);
}
/// <summary>
/// Funkcja generuje token gadu-gadu
/// </summary>
/// <returns>obrazek z tokenem</returns>
public Image GGGetToken() {
string tokenId, tokenUrl;
return HttpGetToken(out tokenId, out tokenUrl);
}
/// <summary>
/// Rejestruje nowego użytkownika gadu-gadu
/// </summary>
/// <param name="email">adres e-mail użytkownika</param>
/// <param name="password">hasło użytkownika</param>
/// <param name="tokenId">numer tokenu (konieczny!)</param>
/// <param name="tokenValue">wartość odczytana z tokenu (konieczna!)</param>
/// <returns>nowo otrzymany numer gadu-gadu lub '0' gdy operacja się nie powiedzie</returns>
public int GGRegisterAccount(string email, string password, string tokenId, string tokenValue) {
return HttpRegisterAccount(email, password, tokenId, tokenValue);
}
/// <summary>
/// Usuwa konto gadu-gadu
/// </summary>
/// <param name="GGNumber">numer GG użytkownika</param>
/// <param name="password">hasło użytkownika</param>
/// <param name="tokenId">numer tokenu (konieczny!)</param>
/// <param name="tokenValue">wartość odczytana z tokenu (konieczna!)</param>
/// <returns>zwraca TRUE jeśli operacja powiedzie się</returns>
public bool GGDeleteAccount(int GGNumber, string password, string tokenId, string tokenValue) {
return HttpDeleteAccount(GGNumber, password, tokenId, tokenValue);
}
/// <summary>
/// Zmiana hasła GG
/// </summary>
/// <param name="GGNumber">numer GG użytkownika</param>
/// <param name="password">aktualne hasło</param>
/// <param name="newPassword">nowe hasło</param>
/// <param name="email">adres e-mail użytkownika</param>
/// <param name="tokenId">numer tokenu (konieczny!)</param>
/// <param name="tokenValue">wartość odczytana z tokenu (konieczna!)</param>
/// <returns>zwraca TRUE jeśli operacja powiedzie się</returns>
public bool GGChangePassword(int GGNumber, string password, string newPassword, string email, string tokenId, string tokenValue) {
return HttpChangePassword(GGNumber, password, newPassword, email, tokenId, tokenValue);
}
/// <summary>
/// Zmiana adresu e-mail klienta
/// </summary>
/// <param name="GGNumber">numer GG użytkownika</param>
/// <param name="password">hasło</param>
/// <param name="newEmail">nowy adres e-mail</param>
/// <param name="tokenId">numer tokenu (konieczny!)</param>
/// <param name="tokenValue">wartość odczytana z tokenu (konieczna!)</param>
/// <returns>zwraca TRUE jeśli operacja powiedzie się</returns>
public bool GGChangeEmail(int GGNumber, string password, string newEmail, string tokenId, string tokenValue) {
return HttpChangePassword(GGNumber, password, password, newEmail, tokenId, tokenValue);
}
// todo: funkcja nie działa
//public bool GGPasswordRemind(int GGNumber, string tokenId, string tokenValue)
//{
// return HttpPasswordRemind(GGNumber, tokenId, tokenValue);
//}
/// <summary>
/// Wysyła wiadomość do użytkownika gadu-gadu
/// </summary>
/// <param name="recipient">numer GG użytkownika, do którego wiadomość ma być wysłana</param>
/// <param name="message">treść wiadomości</param>
public void GGSendMessage(int recipient, string message) {
MessageEngine(new int[] {recipient}, message, null, false);
}
/// <summary>
/// Wysyła wiadomość do kilku użytkowników gadu-gadu (konferencja)
/// </summary>
/// <param name="recipients">numery GG uczestników konferencji</param>
/// <param name="message">treść wiadomości</param>
public void GGSendMessage(int[] recipients, string message) {
MessageEngine(recipients, message, null, true);
}
/// <summary>
/// Wysyła sformatowaną wiadomość do użytkownika gadu-gadu
/// </summary>
/// <param name="recipient">numer GG użytkownika, do którego wiadomość ma być wysłana</param>
/// <param name="message">treść wiadomości</param>
/// <param name="messageFormat">obiekt opisujący formatowanie wiadomości (zobacz plik manual.txt)</param>
public void GGSendMessage(int recipient, string message, SortedDictionary<short,string> messageFormat) {
MessageEngine(new int[] { recipient }, message, messageFormat, false);
}
/// <summary>
/// Wysyła sformatowaną wiadomość do kilku użytkowników gadu-gadu (konferencja)
/// </summary>
/// <param name="recipients">numery GG uczestników konferencji</param>
/// <param name="message">treść wiadomości</param>
/// <param name="messageFormat">obiekt opisujący formatowanie wiadomości (zobacz plik manual.txt)</param>
[Obsolete("Uwaga! Wybrana wersja metody GGSendMessage jeszcze nie działa")]
public void GGSendMessage(int[] recipients, string message, SortedDictionary<short, string> messageFormat) {
MessageEngine(recipients, message, messageFormat, true);
}
/// <summary>
/// Wysyła obrazek przez GG
/// </summary>
/// <param name="recipient">numer GG użytkownika, do którego obrazek ma być wysłany</param>
/// <param name="image">obrazek</param>
public void GGSendImage(int recipient, MemoryStream image) {
ImageEngine(recipient, string.Empty, 0, image);
}
/// <summary>
/// Wysyła obrazek przez GG
/// </summary>
/// <param name="recipient">numer GG użytkownika, do którego obrazek ma być wysłany</param>
/// <param name="imagePath">pełna ścieżka do pliku z obrazkiem</param>
public void GGSendImage(int recipient, string imagePath) {
ImageEngine(recipient, string.Empty, 0, imagePath);
}
/// <summary>
/// Wysyła obrazek przez GG
/// </summary>
/// <param name="recipient">numer GG użytkownika, do którego obrazek ma być wysłany</param>
/// <param name="message">wiadomość dostarczona razem z obrazkiem</param>
/// <param name="imagePos">pozycja w tekście pod jaką ma się pojawić obrazek</param>
/// <param name="imagePath">pełna ścieżka do pliku z obrazkiem</param>
public void GGSendImage(int recipient, string message, int imagePos, string imagePath) {
ImageEngine(recipient, message, imagePos, imagePath);
}
/// <summary>
/// Wysyła obrazek przez GG
/// </summary>
/// <param name="recipient">numer GG użytkownika, do którego obrazek ma być wysłany</param>
/// <param name="message">wiadomość dostarczona razem z obrazkiem</param>
/// <param name="imagePos">pozycja w tekście pod jaką ma się pojawić obrazek</param>
/// <param name="image">obrazek</param>
public void GGSendImage(int recipient, string message, int imagePos, MemoryStream image) {
ImageEngine(recipient, message, imagePos, image);
}
/// <summary>
/// Odczytuje informacje z katalogu publicznego
/// </summary>
public void PubDirRead() {
PublicFolderRead();
}
/// <summary>
/// Wyszukuje osoby w katalogu publicznym
/// </summary>
/// <param name="GGNumber">numer GG osoby (0 jeśli obojętnie)</param>
/// <param name="firstname">imię osoby (pusty string jeśli obojętnie)</param>
/// <param name="lastname">nazwisko osoby (pusty string jeśli obojętnie)</param>
/// <param name="nickname">nick osoby (pusty string jeśli obojętnie)</param>
/// <param name="birthYear">rok urodzenia osoby np. '1980' lub przedział - daty odzielone spacją, np. '1980 1984' (pusty string jeśli obojętnie)</param>
/// <param name="city">miejscowość (pusty string jeśli obojętnie)</param>
/// <param name="gender">płeć osoby</param>
/// <param name="activeOnly">wartość TRUE jeśli szukamy tylko osób dostępnych</param>
public void PubDirSearch(int GGNumber, string firstname, string lastname, string nickname, string birthYear,
string city, GGGender gender, bool activeOnly)
{
PublicFolderSearch(GGNumber, firstname, lastname, nickname, birthYear, city, gender, activeOnly);
}
/// <summary>
/// Szuka kolejnych osób w katalogu publicznym z ostatniego zapytania
/// </summary>
public void PubDirSearchNext() {
PublicFolderSearchNext();
}
}
}