присвячується команді HZ

05.11.2004 09:05:12 Ural+2

Ну ось, з’явилося мальок часу і можна продовжити тему далі =) блін!
Так ми вже підійшли майже до самого головного
в нашій темі? Вже що хоч радує =).
Функція xchat_plugin_init що ж це за функція? Правильно, це головна функція в нашому плагіні,
так сказати точка входу нашого плагіна (знову не те що ти подумав =)).
Отже, розглянемо ближче цю функцію і що в ній міститься. А все дуже просто, як видно з тіла функції
(а там все і так інтуїтивно зрозуміло).
Загальний синтаксис такий:
int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg);
Дана функція виконує щось роль функції main, хоча це не так =)
Її роль – ініціалізувати наш плагін, активувавши ряд хук функцій, які ми вже описали вище
(xchat_hook_command, xchat_hook_print);
Також у цій функції оголошені наступні значення

дискриптору ph передаємо значення, що містяться в plugin_handle
ph = plugin_handle;
назва нашого плагіна
*plugin_name = «hello»;
що плагін вміє робити
*plugin_desc = «Auto send hello users wen join chanel»;
його версія
*plugin_version = «0.1»;

Тепер, мабуть, залишилося це все зібрати у вигляді модулі(бібліотеки)
У юнихе це буде so, для мастдаев це буде dll

UNIX
gcc -Wl,–export-dynamic -Wall -O1 -shared -fPIC hello.c -o hello.so

MACOS
gcc -no-cpp-precomp -g -O2 -Wall -bundle -flat_namespace -undefined suppress -o hello.so hello.c

Windows

a)MSVC
cl -O1 -MD -G5 -DWIN32 -c hello.c
link /DLL /out:hello.dll /SUBSYSTEM:WINDOWS hello.obj /def:hello.def

b) GCC
gcc -Os -DWIN32 -c hello.c
dllwrap –def hello.def –dllname hello.dll hello.o

Після чого завантажуємо нашу бібліотеку в Xchat і тестим її, не завжди з першого разу бібліотека
підвантажується в ХЧАТ. У мене з другого зазвичай.

Ну ось пижалуй і все =). З першою частиною статті покінчено. Приступаємо до другої частини нашої епопеї.
Давайте розглянемо реал приклад такого плагіна — припустимо у вас ВП на каналі, і інший вп вас кинув
з нього, ваше завдання автоматично перезайти на канал і надавати кривдникові п****лей по повній програмі
і все це автоматом.
Ось проста реалізація цього плагіна:

#include
#include «xchat-plugin.h»

static xchat_plugin *ph; /* plugin handle */
static int enable = 1;

static char nick[25];
static int i=1;

static int rejoin_cb(char *word[], char *word_eol[], void *userdata)
{
int j;
const char *curentnick;

i=1;
memset(nick, 0, 25);

while(word[1][i] != ‘зворотний слеш x21’){i++;}
memcpy(nick &word[1][1], i-1);

xchat_printf(ph, “%s was kicked by %s from %s (reason=%s)зворотний слеш n”,
word[4], nick, word[3], word_eol[5]);

if(xchat_get_prefs (ph, «irc_nick1», &curentnick, &j) == 1)
{
if(!strncmp(word[4], curentnick, strlen(curentnick)))
{
xchat_commandf(ph, «join %s», word[3]);
}

}else{xchat_print(ph, «can’t get Curentnick :(»);}

return XCHAT_EAT_NONE;
/* don’t eat this event, let other plugins and xchat see it too */
}

static int kick_cb(char *word[], char *word_eol[], void *userdata)
{
int j;
const char *curentnick;

if(strlen(nick) > 0){
if(xchat_get_prefs (ph, «irc_nick1», &curentnick, &j) == 1)

{

if(strncmp(nick, curentnick, strlen(curentnick)) && !strncmp(word[5],
curentnick, strlen(curentnick)))
{
xchat_commandf(ph, «me VS %s», nick);
xchat_commandf(ph, «me used black magic for %s (fatallity)», nick);
xchat_commandf(ph, «kick %s super compo», nick);
xchat_commandf(ph, «me WINS»);
xchat_commandf(ph, «me ————————————-»);
xchat_commandf(ph, «plugin by me www.aolhackers.ru for Xchat»);
}

}else{xchat_print(ph, «can’t get you nick name»);}

}

//xchat_printf(ph, «word[5]= ” %s», word[5]);

return XCHAT_EAT_NONE;
}

static int mktoggle_cb(char *word[], char *word_eol[], void *userdata)
{
if (!enable)
{
enable = 1;
xchat_print(ph, «MK now enabled! зворотний слеш n»);
} else
{
enable = 0;

xchat_print(ph, «MK now disabled! зворотний слеш n»);
}

return XCHAT_EAT_ALL;
/* eat this command so xchat and other plugins can’t process it */
}

int xchat_plugin_init(xchat_plugin *plugin_handle,
char **plugin_name,
char **plugin_desc,
char **plugin_version,
char *arg)
{
/* we need to save this for use with any xchat_* functions */
ph = plugin_handle;

*plugin_name = «MK»;
*plugin_desc = «Mortal Kombat IRC pligin for Xchat code by payhash»;
*plugin_version = «0.2»;

xchat_hook_command(ph, «MK», XCHAT_PRI_NORM, mktoggle_cb,
«Usage: MK, Turns OFF/ON MortalKombat», 0);

xchat_hook_server(ph, «KICK», XCHAT_PRI_NORM, rejoin_cb, NULL);
xchat_hook_server(ph, «MODE», XCHAT_PRI_NORM, kick_cb, NULL);

xchat_print(ph, «MK loaded successfully! зворотний слеш n»);

return 1; /* return 1 for success */
}

Ну ось, маючи вже необхідний досвід з написання плагіна для хчат, даний сурец не представляє
ніякої складності, я загострю вмнимание на особливо важливих моментах у ньому.
static char nick[25] — ОП який вас викинув з каналу
int rejoin_cb — функція реконекта на канал після того, як вас дропнули

int j;
const char *curentnick;
ці змінні потрібні для того, щоб плагін зміг визначити ваш нік на каналі

while(word[1][i] != ‘зворотний слеш x21’){i++;}
memcpy(nick &word[1][1], i-1);
Тут мальок самодіяльності, але цей блок коду обчислює, хто нас кикнул, і потім зберігає
його в глобальній переманной nick.

xchat_printf(ph, “%s was kicked by %s from %s (reason=%s)зворотний слеш n”,
word[4], nick, word[3], word_eol[5]);
Функція повідомляє хто кого і коли викинув з каналу, все просто як у лазні.

xchat_get_prefs (ph, «irc_nick1», &curentnick, &j)
Функція обчислює ваш нік, під яким ви сидите на каналі

if(!strncmp(word[4], curentnick, strlen(curentnick)))
{
xchat_commandf(ph, «join %s», word[3]);
}
Дивимося, якщо нас кикнули, то робимо rejoin назад на канал. Якщо з кансервы надходить подія
MODE, то спрацьовує функція kick_cb. Те, що доктор прописав. Ця функція викине кривдника
з каналу з відповідними йому почестями =).

xchat_commandf(ph, «me VS %s», nick);
xchat_commandf(ph, «me used black magic for %s (fatallity)», nick);
xchat_commandf(ph, «kick %s super compo», nick);
xchat_commandf(ph, «me WINS»);
xchat_commandf(ph, «me ————————————-»);
xchat_commandf(ph, «plugin by me www.aolhackers.ru for Xchat»);

У функції xchat_plugin_init ми виставляємо три хук(hook) функції які відстежуватимуть
ті або інші події, у нас це KICK MODE MK:

xchat_hook_command(ph, «MK», XCHAT_PRI_NORM, mktoggle_cb,
«Usage: MK, Turns OFF/ON MortalKombat», 0);
xchat_hook_server(ph, «KICK», XCHAT_PRI_NORM, rejoin_cb, NULL);
xchat_hook_server(ph, «MODE», XCHAT_PRI_NORM, kick_cb, NULL);

Функція xchat_hook_server для нас нова, ось і разбирем її ближче.
xchat_hook_server — відстежує серверні події, такі як KICK MODE PRIVMSG, NOTICE, PART
і так далі. В принципі вона робить те ж саме, що і функція xchat_hook_print. Знову ж таки, все просто,
як у селі.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prototype: xchat_hook *xchat_hook_server(xchat_plugin *ph, const char *name, int pri,
xchat_serv_cb *callb, void *userdata);

Description: Registers a function to be called when a certain server event occurs.
You can use this to trap PRIVMSG, NOTICE, PART, a server numeric etc… If you want to hook
every line that comes from the IRC server, you may use the special name of RAW LINE».

Arguments:
ph: Plugin handle (as given to xchat_plugin_init).
name: Name of the server event.
pri: Priority of this command. Use XCHAT_PRI_NORM.
callb: Callback function. This will be called when this event is received from the server.
userdata: Pointer passed to the callback function.
Returns: Pointer to the hook. Can be passed to xchat_unhook.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Збираємо це все і юзаєм =)
UNIX
gcc -Wl,–export-dynamic -Wall -O1 -shared -fPIC hello.c -o hello.so

MACOS
gcc -no-cpp-precomp -g -O2 -Wall -bundle -flat_namespace -undefined suppress -o hello.so hello.c

Windows

a)MSVC
cl -O1 -MD -G5 -DWIN32 -c hello.c
link /DLL /out:hello.dll /SUBSYSTEM:WINDOWS hello.obj /def:hello.def

b) GCC
gcc -Os -DWIN32 -c hello.c
dllwrap –def hello.def –dllname hello.dll hello.o

І наостанок хочу тобі сказати, що плагін під ХЧАТ це корисна штука, так як у мене прямо з ХЧАТА можна
керувати консоллю, не відходять від каси =) але це вже інша історія.

Ну ось, загалом-то і все, що я хотів тобі розповісти. Сподіваюся мене щас не
матюкаєш всякими поганими словами за те, що я тобі розвинув геморой =). І сподіваюся, тебе не сильно пригрузили мої прийми
тивні фрази =). Я лише одне, бажаю тобі удачі тобі у твоїй творчій діяльності =) Бо щоб щось зробити своє,
потрібно до цього підійти творчо. Гаразд, не буду тебе більше відволікати у цій невеликій статті =) своїм запалених
розумом. Пиши, що не ясно, аську мою знають всі.
Спеціально для проекту HackZona