[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Программирование|Delphi|Pascal » Пишем бота для ICQ » Получение списка контактов (Как получить серверный контакт-лист)
Получение списка контактов
Гром Дата: Четверг, 20.01.2011, 06:39 | Сообщение # 1 | Добавить в цитатник [ ? ]
Всевидящее око
Группа: Владелец сайта
Сообщений: 792
Награды: 12
Статус: Offline
Чтобы получить контакт-лист с сервера, нужно послать запрос на сервер на получение этого списка. Запрос посылается спустя несколько секунд после подключения к серверу (логина) и выглядит следующим образом:

icqclient1.RequestContactList;

После того, как мы послали запрос, должен придти ответ от сервера в виде события onServerListRecv. Поэтому мы прямиком идём в обработчик этого события:

procedure TForm1.ICQClient1ServerListRecv(Sender: TObject;
SrvContactList: TList);
var
UserInfo: TUINEntry;
i: integer;
begin
if czap.Caption = '0' then
begin //очищаем список только если загружается первая часть
czap.Caption := '1';
sl.Clear;
end;
if SrvContactList.Count > 0 then
for i := 0 to SrvContactList.Count - 1 do
begin
UserInfo := PUINEntry(SrvContactList.Items[i])^;
sl.Items.Add.Caption:= UserInfo.Nick;
sl.Items.Item[form7.sl.Items.Count-1].SubItems.Add(inttostr(UserInfo.UIN));
sl.Items.Item[form7.sl.Items.Count-1].SubItems.Add(inttostr(UserInfo.CTag));
sl.Items.Item[form7.sl.Items.Count-1].SubItems.Add(inttostr(UserInfo.CGroupID));
sl.Items.Item[form7.sl.Items.Count-1].SubItems.Add(inttostr(UserInfo.CType));
sl.Items.Item[form7.sl.Items.Count-1].SubItems.Add(inttostr(integer(UserInfo.Authorized)));
end;
ICQClient1.DestroyUINList(SrvContactList);
end;

Здесь для отображения списка используется стантартный компонент Tlistview. В него добавляются такие данные, как ник, уин, id контакта и id группы контакта. Однако вы можете убрать те строки, где добавляются данные, которые вам не нужны. Здесь приводится только общая концепция получения серверного контакт-листа.

Важно!!!
Обратите внимание, что контакт лист может придти не весь сразу, а по частям (если в списке много контактов). Поэтому список очищается, если загружается первая часть. Для идентификатора я использовал значение Tlabel.caption, и запрос на получение списка контактов у меня выглядит следующим образом:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
{запрос контак листа при первом запуске}
timer1.Enabled:=false;
form1.czap.Caption := '0';
icqclient1.RequestContactList;
end;

Вот в принципе и всё. Если что непонятно - спрашивайте

 

X-TAZY Дата: Пятница, 01.07.2011, 20:03 | Сообщение # 2 | Добавить в цитатник [ ? ]
Новичок
Группа: Проверенные
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Статус: Offline
У меня несколько вопросов про получение списка контактов:

1. Пытаюсь реализовать отображение статусов в списке контактов с помощью иконок, как это сделано в QIP`е например. Использую ListView в режиме vsSmallIcon и ImageList для хранения иконок статусов. При запуске программы, подключаемся, затем загружаем список контактов и присваиваем всем иконки offline. Затем получаем статусы для всех кто есть в списке контактов и присваиваем им соответствующие статусу иконки. Пока безуспешно. Может есть какие мысли?

2. В CheatICQ при получении списка используется проверка if UserInfo.CType = 0 then (если это пользователь, то добавляем). Здесь имеется ввиду что это контакт а не название группы? А то ведь если делать по примеру выше то получается что в список полученных контактов примешиваются еще и названия групп, правильно?

3. И как тогда отсортировать соответственно по группам список контактов под названиями групп, опять же как в QIP`е?
 

Гром Дата: Пятница, 01.07.2011, 21:02 | Сообщение # 3 | Добавить в цитатник [ ? ]
Всевидящее око
Группа: Владелец сайта
Сообщений: 792
Награды: 12
Статус: Offline
Quote (X-TAZY)
1. Пытаюсь реализовать отображение статусов в списке контактов с помощью иконок, как это сделано в QIP`е например. Использую ListView в режиме vsSmallIcon и ImageList для хранения иконок статусов. При запуске программы, подключаемся, затем загружаем список контактов и присваиваем всем иконки offline. Затем получаем статусы для всех кто есть в списке контактов и присваиваем им соответствующие статусу иконки. Пока безуспешно. Может есть какие мысли?


Покажи код, как ты сделал.

Quote (X-TAZY)
2. В CheatICQ при получении списка используется проверка if UserInfo.CType = 0 then (если это пользователь, то добавляем). Здесь имеется ввиду что это контакт а не название группы? А то ведь если делать по примеру выше то получается что в список полученных контактов примешиваются еще и названия групп, правильно?


Да, именно так. Но если тебе нужны только контакты, то проверяй условие if UserInfo.CType = 0. Опять же, чтобы дальше работать со списком контактов, тебе нужно всё это где-то сохранить. Именно этим и занимается мой пример. Он получает все группы,
ID группы, id контакта. Все эти данные будут нужны для переименовывания, добавления и удаления контактов. А так же для сортировки по группам.

Quote (X-TAZY)
3. И как тогда отсортировать соответственно по группам список контактов под названиями групп, опять же как в QIP`е?


Ну на этот вопрос я уже частично ответил. Ты получаешь все данные списка контактов, как в моём примере, а уже потом перебираешь все записи, сверяя их по группам
 

X-TAZY Дата: Пятница, 01.07.2011, 21:35 | Сообщение # 4 | Добавить в цитатник [ ? ]
Новичок
Группа: Проверенные
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Статус: Offline
Вот код всего будущего бота (как же громко сказано!). Когда происходит событие ICQClient1ServerListRecv, возникает исключение, в чем проблема так и не пойму, с иконками тоже не могу разобраться. Хочу также обратить внимание на событие ICQClientMessageRecv. Т.е. когда приходит сообщение присваиваем соответствующему нику иконку пришедшего сообщения, но в QIP они мигают. Вот как так сделать тоже не могу понять хоть убей.

Сообщение отредактировал X-TAZY - Пятница, 01.07.2011, 22:52
 

X-TAZY Дата: Пятница, 01.07.2011, 21:52 | Сообщение # 5 | Добавить в цитатник [ ? ]
Новичок
Группа: Проверенные
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Статус: Offline
Вообще с компонентом ICQClient больше вопросов, чем ответов. Никогда не юзал его, поэтому извиняюсь за навязчивость, но очень хочется разобраться что к чему.
 

Гром Дата: Пятница, 01.07.2011, 22:09 | Сообщение # 6 | Добавить в цитатник [ ? ]
Всевидящее око
Группа: Владелец сайта
Сообщений: 792
Награды: 12
Статус: Offline
Исключительная ситуация у тебя по всей видимости из-за того, что ты Listview не присвоил набор иконок в свойстве largeimages
 

X-TAZY Дата: Пятница, 01.07.2011, 22:23 | Сообщение # 7 | Добавить в цитатник [ ? ]
Новичок
Группа: Проверенные
Сообщений: 4
Награды: 0
Репутация: 0
Замечания: 0%
Статус: Offline
Разобрался! Я там глобальный динамический массив объявил для хранения полученных уинов, а размер для него не объявил и начал ему в цикле присваивать уины. Думаю отказаться от него и использовать TList, как в CheatICQ.

Сообщение отредактировал X-TAZY - Пятница, 01.07.2011, 22:30
 

Гром Дата: Пятница, 01.07.2011, 22:33 | Сообщение # 8 | Добавить в цитатник [ ? ]
Всевидящее око
Группа: Владелец сайта
Сообщений: 792
Награды: 12
Статус: Offline
Ага, разобрался. Ошибка из-за присвоения значения элементу массива. Во-первых он неправильно объявлен, а во-вторых, раз ты используешь listview, то записывай уин во второй столбец и сделай его скрытым
 

Форум » Программирование|Delphi|Pascal » Пишем бота для ICQ » Получение списка контактов (Как получить серверный контакт-лист)
  • Страница 1 из 1
  • 1
Поиск:

 
Ваш логин: Ваш пароль: