diff options
Diffstat (limited to 'src/perl/xs/Irssi.xs')
-rw-r--r-- | src/perl/xs/Irssi.xs | 933 |
1 files changed, 933 insertions, 0 deletions
diff --git a/src/perl/xs/Irssi.xs b/src/perl/xs/Irssi.xs new file mode 100644 index 00000000..95c75163 --- /dev/null +++ b/src/perl/xs/Irssi.xs @@ -0,0 +1,933 @@ +/* This could be split to different files / modules ..? */ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#undef _ +#include <irssi-plugin.h> +#include <irc-base/server-setup.h> +#include <irc-base/server-reconnect.h> +#include <irc-base/server-redirect.h> + +typedef SERVER_REC *Irssi__Server; +typedef SERVER_CONNECT_REC *Irssi__Connect; +typedef RECONNECT_REC *Irssi__Reconnect; +typedef CHANNEL_REC *Irssi__Channel; +typedef COMMAND_REC *Irssi__Command; +typedef NICK_REC *Irssi__Nick; +typedef BAN_REC *Irssi__Ban; +typedef DCC_REC *Irssi__Dcc; +typedef NETSPLIT_REC *Irssi__Netsplit; +typedef AUTOIGNORE_REC *Irssi__Autoignore; +typedef LOG_REC *Irssi__Log; +typedef LOG_ITEM_REC *Irssi__Logitem; +typedef PLUGIN_REC *Irssi__Plugin; + +#define new_pv(a) (newSVpv((a) == NULL ? "" : (a), (a) == NULL ? 0 : strlen(a))) + +void add_connect_hash(HV *hv, SERVER_CONNECT_REC *conn) +{ + hv_store(hv, "address", 7, new_pv(conn->address), 0); + hv_store(hv, "port", 4, newSViv(conn->port), 0); + hv_store(hv, "password", 8, new_pv(conn->password), 0); + + hv_store(hv, "ircnet", 6, new_pv(conn->ircnet), 0); + hv_store(hv, "wanted_nick", 11, new_pv(conn->nick), 0); + hv_store(hv, "alternate_nick", 14, new_pv(conn->alternate_nick), 0); + hv_store(hv, "username", 8, new_pv(conn->username), 0); + hv_store(hv, "realname", 8, new_pv(conn->realname), 0); + hv_store(hv, "autojoin_channels", 17, new_pv(conn->autojoin_channels), 0); +} + +MODULE = Irssi PACKAGE = Irssi + +PROTOTYPES: ENABLE + +Irssi::Channel +cur_channel() +CODE: + RETVAL = cur_channel; +OUTPUT: + RETVAL + +Irssi::Server +cur_server() +CODE: + RETVAL = cur_channel->server; +OUTPUT: + RETVAL + +void +channels() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Channel", 0); + for (tmp = channels; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +void +servers() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Server", 0); + for (tmp = servers; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +void +commands() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Command", 0); + for (tmp = commands; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +void +dccs() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Dcc", 0); + for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +void +logs() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Log", 0); + for (tmp = logs; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +void +plugins() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Plugin", 0); + for (tmp = plugins; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +Irssi::Connect +server_create_conn(dest, port=6667, password=NULL, nick=NULL, channels=NULL) + char *dest + int port + char *password + char *nick + char *channels + +Irssi::Server +server_find_tag(tag) + char *tag + +Irssi::Server +server_find_ircnet(ircnet) + char *ircnet + +Irssi::Channel +channel_find(channel) + char *channel +CODE: + RETVAL = channel_find(NULL, channel); +OUTPUT: + RETVAL + +void +print(str) + char *str +CODE: + printtext(NULL, NULL, MSGLEVEL_CLIENTNOTICE, str); + +void +signal_emit(signal, ...) + char *signal +CODE: + void *p[6]; + int n; + + memset(p, 0, sizeof(p)); + for (n = 1; n < items && n < 6; n++) { + p[n-1] = SvPOKp(ST(n)) ? SvPV(ST(n), PL_na) : (void *) SvIV((SV*)SvRV(ST(n))); + } + signal_emit(signal, items-1, p[0], p[1], p[2], p[3], p[4], p[5]); + +void +signal_add(signal, func) + char *signal + char *func +CODE: + perl_signal_add(signal, func); + +void +signal_add_last(signal, func) + char *signal + char *func +CODE: + perl_signal_add_last(signal, func); + +void +signal_remove(signal, func) + char *signal + char *func +CODE: + perl_signal_remove(signal, func); + +int +timeout_add(msecs, func, data) + int msecs + char *func + char *data +CODE: + RETVAL = perl_timeout_add(msecs, func, data); +OUTPUT: + RETVAL + +void +timeout_remove(tag) + int tag +CODE: + perl_timeout_remove(tag); + +void +command_bind(cmd, category, func) + char *cmd + char *category + char *func +CODE: + char *signal; + + command_bind(cmd, *category ? category : "Perl scripts' commands", NULL); + signal = g_strconcat("command ", cmd, NULL); + perl_signal_add(signal, func); + g_free(signal); + +void +command_unbind(cmd, func) + char *cmd + char *func +CODE: + char *signal; + + command_unbind(cmd, NULL); + signal = g_strconcat("command ", cmd, NULL); + perl_signal_remove(signal, func); + g_free(signal); + +void +command(cmd, server=cur_channel->server, channel=cur_channel) + char *cmd + Irssi::Server server + Irssi::Channel channel +CODE: + signal_emit("send command", 3, cmd, server, channel); + +int +is_channel(text) + char *text +CODE: + RETVAL = ischannel(*text); +OUTPUT: + RETVAL + +int +irc_mask_match(mask, nick, user, host) + char *mask + char *nick + char *user + char *host + +int +irc_mask_match_address(mask, nick, address) + char *mask + char *nick + char *address + +int +irc_masks_match(masks, nick, address) + char *masks + char *nick + char *address + +char * +irc_get_mask(nick, host, flags) + char *nick + char *host + int flags + +int +level2bits(str) + char *str + +char * +bits2level(bits) + int bits + +int +combine_level(level, str) + int level + char *str + +Irssi::Dcc +dcc_find_item(type, nick, arg) + int type + char *nick + char *arg + +Irssi::Dcc +dcc_find_by_port(nick, port) + char *nick + int port + +char * +dcc_type2str(type) + int type + +int +dcc_str2type(type) + char *type + +void +ignore_add(mask, level) + char *mask + char *level + +void +ignore_remove(mask, level) + char *mask + char *level + +Irssi::Log +log_create(fname, data) + char *fname + char *data + +Irssi::Log +log_create_with_level(fname, level) + char *fname + int level + +Irssi::Log +log_file_find(fname) + char *fname + +void +notifylist_add(nick, ircnet) + char *nick + char *ircnet + +Irssi::Server +notifylist_ison(nick, serverlist) + char *nick + char *serverlist + +int +plugin_load(name, args) + char *name + char *args + +char * +plugin_get_description(name) + char *name + +Irssi::Plugin +plugin_find(name) + char *name + +void +setup_get(option) + char *option +PREINIT: + char *ret; +PPCODE: + switch(setup_option_type(option)) { + case SETUP_TYPE_TOGGLEBUTTON: + XPUSHs(sv_2mortal(newSViv(setup_get_bool(option)))); + break; + case SETUP_TYPE_SPIN: + case SETUP_TYPE_INT_OBJECT: + XPUSHs(sv_2mortal(newSViv(setup_get_int(option)))); + break; + case SETUP_TYPE_ENTRY: + ret = setup_get_str(option); + XPUSHs(sv_2mortal(newSVpv(ret, strlen(ret)))); + break; + } + + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Server PREFIX = server_ +#******************************************************* + +void +send_raw(server, cmd) + Irssi::Server server + char *cmd +CODE: + irc_send_cmd(server, cmd); + +void +command(server, cmd, channel=cur_channel) + char *cmd + Irssi::Server server + Irssi::Channel channel +CODE: + if (channel->server != server) { + GSList *tmp; + + for (tmp = channels; tmp != NULL; tmp = tmp->next) { + CHANNEL_REC *rec = tmp->data; + + if (rec->server == server) { + channel = rec; + break; + } + } + } + signal_emit("send command", 3, cmd, server, channel); + +void +server_disconnect(server) + Irssi::Server server + +Irssi::Channel +channel_create(server, channel, type, automatic) + Irssi::Server server + char *channel + int type + int automatic + +Irssi::Channel +channel_find(server, channel) + Irssi::Server server + char *channel + +Irssi::Channel +channel_find_closest(server, channel, level) + Irssi::Server server + char *channel + int level + +Irssi::Channel +channel_find_level(server, level) + Irssi::Server server + int level + +void +printtext(server, channel, level, str) + Irssi::Server server + char *channel + int level + char *str +CODE: + printtext(server, channel, level, str); + +void +irc_send_cmd_split(server, cmd, arg, max_nicks) + Irssi::Server server + char *cmd + int arg + int max_nicks + +void +ctcp_send_reply(server, data) + Irssi::Server server + char *data + +Irssi::Netsplit +netsplit_find(server, nick, address) + Irssi::Server server + char *nick + char *address + +Irssi::Nick +netsplit_find_channel(server, nick, address, channel) + Irssi::Server server + char *nick + char *address + char *channel + +void +rawlog_input(server, str) + Irssi::Server server + char *str + +void +rawlog_output(server, str) + Irssi::Server server + char *str + +void +rawlog_redirect(server, str) + Irssi::Server server + char *str + +void +server_redirect_init(server, command, last, ...) + Irssi::Server server + char *command + int last +PREINIT: + GSList *list; + int n; +CODE: + list = NULL; + for (n = 3; n < items; n++) { + list = g_slist_append(list, SvPV(ST(n), PL_na)); + } + server_redirect_initv(server, command, last, list); + +int +server_redirect_single_event(server, arg, last, group, event, signal, argpos) + Irssi::Server server + char *arg + int last + int group + char *event + char *signal + int argpos + +void +server_redirect_event(server, arg, last, ...) + Irssi::Server server + char *arg + int last +PREINIT: + int n, group; +CODE: + group = 0; + for (n = 3; n+3 <= items; n += 3, last--) { + group = server_redirect_single_event(server, arg, last > 0, group, + (char *) SvPV(ST(n), PL_na), (char *) SvPV(ST(n+1), PL_na), (int) SvIV(ST(n+2))); + } + +void +autoignore_add(server, type, nick) + Irssi::Server server + int type + char *nick + +int +autoignore_remove(server, mask, level) + Irssi::Server server + char *mask + char *level + +int +ignore_check(server, nick, host, type) + Irssi::Server server + char *nick + char *host + int type + +int +notifylist_ison_server(server, nick) + Irssi::Server server + char *nick + +void +values(server) + Irssi::Server server +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + add_connect_hash(hv, server->connrec); + hv_store(hv, "real_address", 12, new_pv(server->real_address), 0); + hv_store(hv, "tag", 3, new_pv(server->tag), 0); + hv_store(hv, "nick", 4, new_pv(server->nick), 0); + hv_store(hv, "usermode", 8, new_pv(server->usermode), 0); + hv_store(hv, "usermode_away", 13, newSViv(server->usermode_away), 0); + hv_store(hv, "away_reason", 11, new_pv(server->away_reason), 0); + hv_store(hv, "connected", 9, newSViv(server->connected), 0); + hv_store(hv, "connection_lost", 15, newSViv(server->connection_lost), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Connect PREFIX = server_ +#******************************************************* + +void +values(conn) + Irssi::Connect conn +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + add_connect_hash(hv, conn); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +Irssi::Server +server_connect(conn) + Irssi::Connect conn + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Reconnect +#******************************************************* + +void +values(reconnect) + Irssi::Reconnect reconnect +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + add_connect_hash(hv, reconnect->conn); + hv_store(hv, "tag", 3, newSViv(reconnect->tag), 0); + hv_store(hv, "next_connect", 12, newSViv(reconnect->next_connect), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Channel PREFIX = channel_ +#******************************************************* + +void +command(channel, cmd) + Irssi::Channel channel + char *cmd +CODE: + signal_emit("send command", 3, cmd, channel->server, channel); + +void +channel_destroy(channel) + Irssi::Channel channel + +void +channel_change_name(channel, name) + Irssi::Channel channel + char *name + +char * +channel_get_mode(channel) + Irssi::Channel channel + +Irssi::Nick +nicklist_insert(channel, nick, op, voice, send_massjoin) + Irssi::Channel channel + char *nick + int op + int voice + int send_massjoin + +void +nicklist_remove(channel, nick) + Irssi::Channel channel + Irssi::Nick nick + +Irssi::Nick +nicklist_find(channel, mask) + Irssi::Channel channel + char *mask + +void +nicklist_getnicks(channel) + Irssi::Channel channel +PREINIT: + GSList *list, *tmp; + HV *stash; +PPCODE: + list = nicklist_getnicks(channel); + + stash = gv_stashpv("Irssi::Nick", 0); + for (tmp = list; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + g_slist_free(list); + +Irssi::Ban +ban_add(channel, ban, nick, time) + Irssi::Channel channel + char *ban + char *nick + time_t time + +void +ban_remove(channel, ban) + Irssi::Channel channel + char *ban + +Irssi::Ban +ban_exception_add(channel, ban, nick, time) + Irssi::Channel channel + char *ban + char *nick + time_t time + +void +ban_exception_remove(channel, ban) + Irssi::Channel channel + char *ban + +char * +ban_get_mask(channel, nick) + Irssi::Channel channel + char *nick + +void +modes_set(channel, data, mode) + Irssi::Channel channel + char *data + char *mode +CODE: + modes_set(data, mode, channel->server, channel); + +void +modes_parse_channel(channel, setby, modestr) + Irssi::Channel channel + char *setby + char *modestr + +void +invitelist_add(channel, mask) + Irssi::Channel channel + char *mask + +void +invitelist_remove(channel, mask) + Irssi::Channel channel + char *mask + +void +values(channel) + Irssi::Channel channel +PREINIT: + HV *hv, *stash; + char *type; +PPCODE: + switch (channel->type) + { + case CHANNEL_TYPE_CHANNEL: + type = "channel"; + break; + case CHANNEL_TYPE_QUERY: + type = "query"; + break; + case CHANNEL_TYPE_DCC_CHAT: + type = "dcc chat"; + break; + default: + type = "empty"; + break; + } + hv = newHV(); + stash = gv_stashpv("Irssi::Server", 0); + hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(channel->server))), stash), 0); + + hv_store(hv, "name", 4, new_pv(channel->name), 0); + hv_store(hv, "type", 4, new_pv(type), 0); + + hv_store(hv, "topic", 5, new_pv(channel->topic), 0); + hv_store(hv, "key", 3, new_pv(channel->key), 0); + hv_store(hv, "limit", 5, newSViv(channel->limit), 0); + + hv_store(hv, "level", 5, newSViv(channel->level), 0); + hv_store(hv, "new_data", 8, newSViv(channel->new_data), 0); + + hv_store(hv, "synced", 6, newSViv(channel->synced), 0); + hv_store(hv, "wholist", 7, newSViv(channel->wholist), 0); + hv_store(hv, "names_got", 9, newSViv(channel->names_got), 0); + hv_store(hv, "chanop", 6, newSViv(channel->chanop), 0); + hv_store(hv, "left", 4, newSViv(channel->left), 0); + hv_store(hv, "kicked", 6, newSViv(channel->kicked), 0); + + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Command +#******************************************************* + +void +values(cmd) + Irssi::Command cmd +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "cmd", 3, new_pv(cmd->cmd), 0); + hv_store(hv, "category", 8, new_pv(cmd->category), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Nick +#******************************************************* + +void +values(nick) + Irssi::Nick nick +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "nick", 4, new_pv(nick->nick), 0); + hv_store(hv, "host", 4, new_pv(nick->host), 0); + hv_store(hv, "name", 4, new_pv(nick->realname), 0); + hv_store(hv, "hops", 4, newSViv(nick->hops), 0); + hv_store(hv, "op", 2, newSViv(nick->op), 0); + hv_store(hv, "voice", 5, newSViv(nick->voice), 0); + hv_store(hv, "gone", 4, newSViv(nick->gone), 0); + hv_store(hv, "ircop", 5, newSViv(nick->ircop), 0); + hv_store(hv, "last_check", 10, newSViv(nick->last_check), 0); + hv_store(hv, "send_massjoin", 13, newSViv(nick->send_massjoin), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Ban +#******************************************************* + +void +values(ban) + Irssi::Ban ban +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "ban", 3, new_pv(ban->ban), 0); + hv_store(hv, "setby", 5, new_pv(ban->setby), 0); + hv_store(hv, "time", 4, newSViv(ban->time), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Dcc PREFIX = dcc_ +#******************************************************* + +void +dcc_destroy(dcc) + Irssi::Dcc dcc + +void +values(ban) + Irssi::Ban ban +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "ban", 3, new_pv(ban->ban), 0); + hv_store(hv, "setby", 5, new_pv(ban->setby), 0); + hv_store(hv, "time", 4, newSViv(ban->time), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Netsplit +#******************************************************* + +void +values(netsplit) + Irssi::Netsplit netsplit +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "nick", 4, new_pv(netsplit->nick), 0); + hv_store(hv, "address", 7, new_pv(netsplit->address), 0); + hv_store(hv, "server", 6, new_pv(netsplit->server), 0); + hv_store(hv, "destserver", 10, new_pv(netsplit->destserver), 0); + hv_store(hv, "destroy", 7, newSViv(netsplit->destroy), 0); + /*FIXME: add GSList *channels;*/ + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Autoignore +#******************************************************* + +void +values(ai) + Irssi::Autoignore ai +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "nick", 4, new_pv(ai->nick), 0); + hv_store(hv, "timeleft", 8, newSViv(ai->timeleft), 0); + hv_store(hv, "level", 5, newSViv(ai->level), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Log PREFIX = log_ +#******************************************************* + +void +values(log) + Irssi::Log log +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "fname", 5, new_pv(log->fname), 0); + hv_store(hv, "autoopen_log", 12, newSViv(log->autoopen_log), 0); + hv_store(hv, "last", 4, newSViv(log->last), 0); + hv_store(hv, "level", 5, newSViv(log->level), 0); + /*FIXME: add GSList *items;*/ + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +void +destroy(log) + Irssi::Log log +CODE: + log_file_destroy(log); + +int +open(log) + Irssi::Log log +CODE: + log_file_open(log); + +void +close(log) + Irssi::Log log +CODE: + log_file_close(log); + +void +log_append_item(log, name, level) + Irssi::Log log + char *name + int level + +void +log_remove_item(log, name) + Irssi::Log log + char *name + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Logitem +#******************************************************* + +void +values(item) + Irssi::Logitem item +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "name", 4, new_pv(item->name), 0); + hv_store(hv, "level", 5, newSViv(item->level), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************************************* +MODULE = Irssi PACKAGE = Irssi::Plugin PREFIX = plugin_ +#******************************************************* + +void +values(plugin) + Irssi::Plugin plugin +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "name", 4, new_pv(plugin->name), 0); + hv_store(hv, "description", 11, new_pv(plugin->description), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); |