The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Тематический каталог: Написание плагина для IRC-клиента X-Chat (plugin gcc), auto_topic (??), 13-Июн-05, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


1. "Написание плагина для IRC-клиента X-Chat (plugin gcc)"  +/
Сообщение от NeTxXxemail (??), 13-Июн-05, 16:28 
Еще хотелось бы добавить пару слов о принципе реализации списка пользователей.
Все делается очень просто.
Объявляем массив указателей на приведенную выше структуру:
static UDATA **u_list;
Также определяем переменную-счетчик пользователей
static uint u_count;

Далее пишем функцию инициализации списка:
void ulist_init(void) {
    u_count = 0; // обнуляем счетчик
    // выделяем память под один элемент типа UDATA*, т.е. указатель.
    // в большинстве случаев его размер равен 32-ум битам
    u_list = (PUDATA)malloc(sizeof(UDATA*)*1);
    memset(u_list,0,sizeof(UDATA*)*1); // заполняем память нулями
    return;
}

Соответственно, функция освобождения памяти (деинициализации):
void ulist_free(void) {
    uint i = 0;
    for (i=0;i<u_count;i++) { // поочередно освобождаем память
        if (u_list[i]) free(u_list[i]); // всех элементов списка (не забывая делать проверку на вшивость)
    }
    if (u_list) free(u_list); // освобождаем память самого списка
    return;
}

Новый элемент добавляется путем добавления в конец списка указателя на новый элемент.
Для этого нам необходимо увеличить размер самого списка ровно на sizeof(UDATA*):
void ulist_add(char *name, char *lastmsg, char *channel, uint r_count) {
    UDATA *pu = malloc(sizeof(UDATA)); // выделяем память под нового пользователя
    // далее заполняем все необходимые поля структуры
    strncpy(pu->u_name,name,sizeof(pu->u_name));
    strncpy(pu->u_lastmsg,lastmsg,sizeof(pu->u_lastmsg));
    strncpy(pu->u_channel,channel,sizeof(pu->u_channel));
    pu->u_rcounter = r_count;
    pu->u_thook = NULL;
    // присваиваем последнему элементу списка адрес структуры,
    // увеличивая после этого счетчик элементов
    u_list[u_count++] = pu;
    // увеличиваем размер списка. (new_size = sizeof(void*)*count)
    u_list = (PUDATA)realloc(u_list,sizeof(UDATA*)*u_count);
    return;
}

Еще нам понадобятся функции поиска и редактирования пользователя. Предлагаю написать их
самостоятельно, для того чтобы хоть чуточку поднапрячь ваш мозговой центр :)
Принцип этих функций довольно прост и очевиден.
Все же я поясню.. Для поиска пользователя по его имени просто пробегаем циклом по всем элементам
списка, сравнивая имя пользователя в текущем элементе с искомым именем. При совпадении, просто
возвращаем указатель на этот элемент.

С редактированием еще проще. Так же как и в функции поиска получаем нужный элемент списка и
устанавливаем новые значения всем элементам структуры.
Надеюсь, с этим каких бы то ни было трудностей не возникнет.

и еще, в конец главного модуля неплохо бы было добавить функцию деинициализации и освободить память под массив пользователей

// deinitialization entry point
int xchat_plugin_deinit (xchat_plugin *plugin_handle)
{

    // releasing user list
    ulist_free();
    xchat_print (plugin_handle, "norepeat-plugin unloaded\n");

    return 1;
}

Ответить | Правка | Наверх | Cообщить модератору

2. "Написание плагина для IRC-клиента X-Chat (plugin gcc)"  +/
Сообщение от OM (?), 14-Июн-05, 22:46 
При всём моём уважении к XChat (я являюсь его пользователем и
есть плагин свой). У его системы есть один большой недостаток:
невозможно управлять GUI в полной мере
(скрывать/показывать/мигать - это не то о чём я).

Приходится прибегать к настолько обходным путям.....
Конкретно - использование GTK затруднено некоторым геммором,
связанным с запуском цикла обработки в другом цикле
(цикла плагина в цикле XChat).

К чему я клоню - проблема решаема в принципе, но недостаточно
проста для рядового плагинописателя (кои, в большинстве своём,
и являются массовыми архитекторами расширений и их кодерами).

Ответить | Правка | Наверх | Cообщить модератору

3. "Написание плагина для IRC-клиента X-Chat (plugin gcc)"  +/
Сообщение от NeTxXxemail (??), 16-Июн-05, 16:26 
>При всём моём уважении к XChat (я являюсь его пользователем и
>есть плагин свой). У его системы есть один большой недостаток:
>невозможно управлять GUI в полной мере
>(скрывать/показывать/мигать - это не то о чём я).
>
>Приходится прибегать к настолько обходным путям.....
>Конкретно - использование GTK затруднено некоторым геммором,
>связанным с запуском цикла обработки в другом цикле
>(цикла плагина в цикле XChat).
>
>К чему я клоню - проблема решаема в принципе, но недостаточно
>проста для рядового плагинописателя (кои, в большинстве своём,
>и являются массовыми архитекторами расширений и их кодерами).


Согласен с вами, XChat'овскому plugin engine не хватает этой возможности.. Хотя в принципе гуи можно писать и отдельно, не используя XChat (создаешь виджеты из so'шника и строишь собственный гуи) а потом вызывать его через команды (можно создать менюшки с их алиасами).. но увы этого не всегда достаточно..
Однако в xchat уже есть заголовки двух функций для работы с гуи:
void *
xchat_plugingui_add (xchat_plugin *ph,
             const char *filename,
             const char *name,
             const char *desc,
             const char *version,
             char *reserved);

void
xchat_plugingui_remove (xchat_plugin *ph,
            void *handle)
но, к сожалению, они пока не документированы.
исходя из этого, можно предположить что в следующих версиях они всеже улучшат свой plugin-engine.. возможно появится что-то и для работы с гуи..
ждем обновлений :)

Ответить | Правка | Наверх | Cообщить модератору

5. "Написание плагина для IRC-клиента X-Chat (plugin gcc)"  +/
Сообщение от Exanemail (?), 06-Июл-05, 20:52 
Просьба.
На http://digdilem.org/code/xchat/xchat.php есть плагин Flash-Annoyances, это perl скрипт позволяющий убрать сообщения о Join и Quit.
Они просто раздражают. Perl инсталировать можно, но лишьнии проблеммы.
Кто нибудь знает где можно найти .dll с такими же функциями ? Или может кто-то может написать такой .dll ?
И ещё одни вопрос: У меня есть BorlandC++Builder 6, можно или скомпилировать приведённый исходник в BCB ?
SXN
Ответить | Правка | К родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру