Обсуждение статьи тематического каталога: Написание плагина для IRC-клиента X-Chat (plugin gcc)Ссылка на текст статьи: http://www.opennet.me/base/dev/xchat_write_plugin.txt.html
Еще хотелось бы добавить пару слов о принципе реализации списка пользователей.
Все делается очень просто.
Объявляем массив указателей на приведенную выше структуру:
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;
}
При всём моём уважении к XChat (я являюсь его пользователем и
есть плагин свой). У его системы есть один большой недостаток:
невозможно управлять GUI в полной мере
(скрывать/показывать/мигать - это не то о чём я).Приходится прибегать к настолько обходным путям.....
Конкретно - использование GTK затруднено некоторым геммором,
связанным с запуском цикла обработки в другом цикле
(цикла плагина в цикле XChat).К чему я клоню - проблема решаема в принципе, но недостаточно
проста для рядового плагинописателя (кои, в большинстве своём,
и являются массовыми архитекторами расширений и их кодерами).
>При всём моём уважении к 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.. возможно появится что-то и для работы с гуи..
ждем обновлений :)
Просьба.
На http://digdilem.org/code/xchat/xchat.php есть плагин Flash-Annoyances, это perl скрипт позволяющий убрать сообщения о Join и Quit.
Они просто раздражают. Perl инсталировать можно, но лишьнии проблеммы.
Кто нибудь знает где можно найти .dll с такими же функциями ? Или может кто-то может написать такой .dll ?
И ещё одни вопрос: У меня есть BorlandC++Builder 6, можно или скомпилировать приведённый исходник в BCB ?
SXN
А как насчёт обработки нажатия клавишь? Вот допустим я хотел написать плагин чтобы по нажатию F8 (например) к тому что было введено в строку ввода сообщения прибавлялась какая нибудь надпись, или что нибудь с этой стракой становилось, например выполось бы сохранения где нибудь в логах на будующее. Но я чего то так и не нашёл как обрабатывать нажатия клавишь и как получить доступ к строке ввода.
>А как насчёт обработки нажатия клавишь? Вот допустим я хотел написать плагин
>чтобы по нажатию F8 (например) к тому что было введено в
>строку ввода сообщения прибавлялась какая нибудь надпись, или что нибудь с
>этой стракой становилось, например выполось бы сохранения где нибудь в логах
>на будующее. Но я чего то так и не нашёл как
>обрабатывать нажатия клавишь и как получить доступ к строке ввода.
действия на нажатия клавиш можно забиндить прямо из xchat'a (xchat keyboard shortcuts), а вот по поводу строки ввода сложнее.. получить данные из нее можно через функцию xchat_get_info(ph,"inputbox"). а вот сделать обратное.. походу пока никак (если только gtk не поддерживает сообщения. иначе можно сделать как в винде. найти хендл, и типа SetDlgItemInt(..) :)..
вообще то в исходниках xchat'ового plugin-engine оч много функций-заглушек.. те же xchat_plugingui_add() xchat_plugingui_remove().. они типа делают то что просто подгружают плугин и помечают как dummy :) интересный подход однако.. также были и заглушки для этого inputbox..в итоге нам ничего не остается делать кроме как ждать новых версий :) м.б. они поступят как создатели anjuta - создадут новую unstable-ветку со всеми фишками и новым plugin-engine..
ну или под конец самим править код :) (я все чаще начинаю об этом задумываться, btw =))
Ничего писать не надо. Всё есть в Xchat - e
/set irc_conf_mode on
и Join и Quit - мегасы не выводятся на экран.
any of u guys know how to create a dll to write the x-chat plugin in C# ???
>any of u guys know how to create a dll to write
>the x-chat plugin in C# ???hmm.. generally no idea, but m.b. you should create basic c# .dll, define all imports, write necessary code and then simply compile it in native code?
Очень необходим плагин под Х чат, для хэлпера, смысл такой, рекция на определённые фразы на канале (каналах), ответ автоматически берётся из файла, набор фраз тоже файл (проще всего текстовые), это как нибудь можно реализовать? из приведенного описания плагина я всё понял, сам не напишу, если кто нибудь задавался такой интересной проблемой, помогите...
всё (желательно проверенное) отсылайте на почту или ответьте тут. E-mail: titarenko5@mail.ru