From 62dee8fdafe558b638cfc1995841e3ca7e007368 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sun, 1 Oct 2000 20:48:48 +0000 Subject: [PATCH] Perl works again :) Split to Irssi and Irssi::Irc packages. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@705 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/perl/Makefile.am | 59 +++++---- src/perl/irc/.cvsignore | 7 ++ src/perl/irc/Bans.xs | 40 ++++++ src/perl/irc/Dcc.xs | 81 ++++++++++++ src/perl/irc/Flood.xs | 29 +++++ src/perl/irc/Ignore.xs | 74 +++++++++++ src/perl/irc/Irc.pm | 29 +++++ src/perl/irc/Irc.xs | 17 +++ src/perl/irc/IrcChannel.xs | 44 +++++++ src/perl/irc/IrcQuery.xs | 7 ++ src/perl/irc/IrcServer.xs | 37 ++++++ src/perl/irc/Makefile.PL.in | 6 + src/perl/irc/Modes.xs | 67 ++++++++++ src/perl/irc/Netsplit.xs | 51 ++++++++ src/perl/irc/Notifylist.xs | 71 +++++++++++ src/perl/irc/module.h | 28 +++++ src/perl/irc/typemap | 14 +++ src/perl/irssi-perl.c | 5 +- src/perl/perl-common.c | 240 ++++++++++++++++++++++++++++++++++++ src/perl/perl-common.h | 21 ++++ 20 files changed, 904 insertions(+), 23 deletions(-) create mode 100644 src/perl/irc/.cvsignore create mode 100644 src/perl/irc/Bans.xs create mode 100644 src/perl/irc/Dcc.xs create mode 100644 src/perl/irc/Flood.xs create mode 100644 src/perl/irc/Ignore.xs create mode 100644 src/perl/irc/Irc.pm create mode 100644 src/perl/irc/Irc.xs create mode 100644 src/perl/irc/IrcChannel.xs create mode 100644 src/perl/irc/IrcQuery.xs create mode 100644 src/perl/irc/IrcServer.xs create mode 100644 src/perl/irc/Makefile.PL.in create mode 100644 src/perl/irc/Modes.xs create mode 100644 src/perl/irc/Netsplit.xs create mode 100644 src/perl/irc/Notifylist.xs create mode 100644 src/perl/irc/module.h create mode 100644 src/perl/irc/typemap create mode 100644 src/perl/perl-common.c create mode 100644 src/perl/perl-common.h diff --git a/src/perl/Makefile.am b/src/perl/Makefile.am index 8ef5ddf0..4272cdfe 100644 --- a/src/perl/Makefile.am +++ b/src/perl/Makefile.am @@ -11,39 +11,54 @@ INCLUDES = $(GLIB_CFLAGS) \ libirssi_perl_la_SOURCES = \ irssi-perl.c \ + perl-common.c \ xsinit.c perl-signals.h: $(top_srcdir)/docs/signals.txt $(srcdir)/get-signals.pl cat $(top_srcdir)/docs/signals.txt | $(perlpath) $(srcdir)/get-signals.pl > perl-signals.h -EXTRA_DIST = \ - libperl_dynaloader.la \ - get-signals.pl \ - core/Irssi-bans.xs \ - core/Irssi-channel.xs \ - core/Irssi-core.xs \ - core/Irssi-dcc.xs \ - core/Irssi-flood.xs \ - core/Irssi-ignore.xs \ - core/Irssi-log.xs \ - core/Irssi-masks.xs \ - core/Irssi-modes.xs \ - core/Irssi-netsplit.xs \ - core/Irssi-notifylist.xs \ - core/Irssi-query.xs \ - core/Irssi-rawlog.xs \ - core/Irssi-server.xs \ - core/Irssi-settings.xs \ - core/Irssi-window.xs \ +CORE_SOURCES = \ + core/Channel.xs \ + core/Core.xs \ + core/Log.xs \ + core/Masks.xs \ + core/Query.xs \ + core/Rawlog.xs \ + core/Server.xs \ + core/Settings.xs \ + core/Window.xs \ core/Irssi.xs \ core/Irssi.pm \ core/Makefile.PL.in \ - core/typemap + core/typemap \ + core/module.h + +IRC_SOURCES = \ + irc/Bans.xs \ + irc/Dcc.xs \ + irc/Flood.xs \ + irc/Ignore.xs \ + irc/IrcChannel.xs \ + irc/IrcQuery.xs \ + irc/IrcServer.xs \ + irc/Modes.xs \ + irc/Netsplit.xs \ + irc/Notifylist.xs \ + irc/Irc.xs \ + irc/Irc.pm \ + irc/Makefile.PL.in \ + irc/typemap \ + irc/module.h + +EXTRA_DIST = \ + libperl_dynaloader.la \ + get-signals.pl \ + $(CORE_SOURCES) \ + $(IRC_SOURCES) noinst_HEADERS = \ module.h \ - core/module.h \ - irc/module.h + perl-common.h all-local: for dir in core irc; do cd $$dir && if [ ! -f Makefile ]; then if [ "x$(PERL_LIB_DIR)" = "x" ]; then $(perlpath) Makefile.PL; else $(perlpath) Makefile.PL LIB=$(PERL_LIB_DIR); fi; fi && $(MAKE) && cd ..; done diff --git a/src/perl/irc/.cvsignore b/src/perl/irc/.cvsignore new file mode 100644 index 00000000..092c3980 --- /dev/null +++ b/src/perl/irc/.cvsignore @@ -0,0 +1,7 @@ +Makefile +Makefile.PL +Irc.c +Irc.bs +*.o +pm_to_blib +blib diff --git a/src/perl/irc/Bans.xs b/src/perl/irc/Bans.xs new file mode 100644 index 00000000..cd4ea9b8 --- /dev/null +++ b/src/perl/irc/Bans.xs @@ -0,0 +1,40 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc + +void +ban_set_type(type) + char *type + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel +#******************************* + +char * +ban_get_mask(channel, nick) + Irssi::Irc::Channel channel + char *nick + +void +ban_set(channel, bans) + Irssi::Irc::Channel channel + char *bans + +void +ban_remove(channel, ban) + Irssi::Irc::Channel channel + char *ban + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Ban +#******************************* + +void +values(ban) + Irssi::Irc::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))); diff --git a/src/perl/irc/Dcc.xs b/src/perl/irc/Dcc.xs new file mode 100644 index 00000000..4bc0a5b0 --- /dev/null +++ b/src/perl/irc/Dcc.xs @@ -0,0 +1,81 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc + +void +dccs() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Irc::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))); + } + +Irssi::Irc::Dcc +dcc_find_item(type, nick, arg) + int type + char *nick + char *arg + +Irssi::Irc::Dcc +dcc_find_by_port(nick, port) + char *nick + int port + +void +dcc_ctcp_message(target, server, chat, notice, msg) + char *target + Irssi::Irc::Server server + Irssi::Irc::Dcc chat + int notice + char *msg + +Irssi::Irc::Dcc +item_get_dcc(item) + void *item + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Dcc PREFIX = dcc_ +#******************************* + +void +dcc_destroy(dcc) + Irssi::Irc::Dcc dcc + +void +dcc_chat_send(dcc, data) + Irssi::Irc::Dcc dcc + char *data + +void +values(dcc) + Irssi::Irc::Dcc dcc +PREINIT: + HV *hv, *stash; +PPCODE: + hv = newHV(); + hv_store(hv, "type", 4, new_pv((char *) dcc_type2str(dcc->type)), 0); + hv_store(hv, "created", 7, newSViv(dcc->created), 0); + + hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(dcc->server))), + irssi_get_stash(dcc->server)), 0); + hv_store(hv, "nick", 4, new_pv(dcc->nick), 0); + + stash = gv_stashpv("Irssi::Irc::Dcc", 0); + hv_store(hv, "chat", 4, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(dcc->chat))), stash), 0); + + hv_store(hv, "ircnet", 6, new_pv(dcc->ircnet), 0); + hv_store(hv, "mynick", 6, new_pv(dcc->mynick), 0); + + hv_store(hv, "arg", 3, new_pv(dcc->arg), 0); + hv_store(hv, "file", 4, new_pv(dcc->file), 0); + + hv_store(hv, "addr", 4, new_pv(dcc->addrstr), 0); + hv_store(hv, "port", 4, newSViv(dcc->port), 0); + + hv_store(hv, "size", 4, newSViv(dcc->size), 0); + hv_store(hv, "transfd", 7, newSViv(dcc->transfd), 0); + hv_store(hv, "skipped", 7, newSViv(dcc->skipped), 0); + hv_store(hv, "starttime", 9, newSViv(dcc->starttime), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + diff --git a/src/perl/irc/Flood.xs b/src/perl/irc/Flood.xs new file mode 100644 index 00000000..8738be04 --- /dev/null +++ b/src/perl/irc/Flood.xs @@ -0,0 +1,29 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server + +void +autoignore_add(server, nick, level) + Irssi::Irc::Server server + char *nick + int level + +int +autoignore_remove(server, mask, level) + Irssi::Irc::Server server + char *mask + int level + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Autoignore +#******************************* + +void +values(ai) + Irssi::Irc::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))); diff --git a/src/perl/irc/Ignore.xs b/src/perl/irc/Ignore.xs new file mode 100644 index 00000000..c19eb5c8 --- /dev/null +++ b/src/perl/irc/Ignore.xs @@ -0,0 +1,74 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc + +void +ignores() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Irc::Ignore", 0); + for (tmp = servers; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +int +ignore_check(nick, host, channel, text, level) + char *nick + char *host + char *channel + char *text + int level +CODE: + RETVAL = ignore_check(NULL, nick, host, channel, text, level); +OUTPUT: + RETVAL + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server +#******************************* + +int +ignore_check(server, nick, host, channel, text, level) + Irssi::Irc::Server server + char *nick + char *host + char *channel + char *text + int level + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Ignore PREFIX = ignore_ +#******************************* + +void +values(ignore) + Irssi::Irc::Ignore ignore +PREINIT: + HV *hv; + AV *av; + char **tmp; +PPCODE: + hv = newHV(); + hv_store(hv, "mask", 4, new_pv(ignore->mask), 0); + hv_store(hv, "servertag", 9, new_pv(ignore->servertag), 0); + av = newAV(); + for (tmp = ignore->channels; *tmp != NULL; tmp++) { + av_push(av, new_pv(*tmp)); + } + hv_store(hv, "channels", 8, newRV_noinc((SV*)av), 0); + hv_store(hv, "pattern", 7, new_pv(ignore->pattern), 0); + + hv_store(hv, "level", 5, newSViv(ignore->level), 0); + hv_store(hv, "except_level", 12, newSViv(ignore->except_level), 0); + + hv_store(hv, "regexp", 6, newSViv(ignore->regexp), 0); + hv_store(hv, "fullword", 8, newSViv(ignore->fullword), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +void +ignore_add_rec(rec) + Irssi::Irc::Ignore rec + +void +ignore_update_rec(rec) + Irssi::Irc::Ignore rec diff --git a/src/perl/irc/Irc.pm b/src/perl/irc/Irc.pm new file mode 100644 index 00000000..79cf88c5 --- /dev/null +++ b/src/perl/irc/Irc.pm @@ -0,0 +1,29 @@ +# +# Perl interface to irssi functions. +# + +package Irssi::Irc; + +use strict; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); + +$VERSION = "0.20"; + +require Exporter; +require DynaLoader; + +@ISA = qw(Exporter DynaLoader); +@EXPORT = qw(); +@EXPORT_OK = qw(); + +bootstrap Irssi::Irc $VERSION; + +@Irssi::Irc::Chatnet::ISA = qw(Irssi::Chatnet); +@Irssi::Irc::Server::ISA = qw(Irssi::Server); +@Irssi::Irc::ServerConnect::ISA = qw(Irssi::ServerConnect); +@Irssi::Irc::ServerSetup::ISA = qw(Irssi::ServerSetup); +@Irssi::Irc::Channel::ISA = qw(Irssi::Channel); +@Irssi::Irc::Query::ISA = qw(Irssi::Query); + +1; + diff --git a/src/perl/irc/Irc.xs b/src/perl/irc/Irc.xs new file mode 100644 index 00000000..0d00e9ce --- /dev/null +++ b/src/perl/irc/Irc.xs @@ -0,0 +1,17 @@ +#include "module.h" + +MODULE = Irssi::Irc PACKAGE = Irssi::Irc + +PROTOTYPES: ENABLE + +INCLUDE: Bans.xs +INCLUDE: Ignore.xs +INCLUDE: IrcServer.xs +INCLUDE: IrcChannel.xs +INCLUDE: IrcQuery.xs +INCLUDE: Modes.xs +INCLUDE: Netsplit.xs + +INCLUDE: Dcc.xs +INCLUDE: Flood.xs +INCLUDE: Notifylist.xs diff --git a/src/perl/irc/IrcChannel.xs b/src/perl/irc/IrcChannel.xs new file mode 100644 index 00000000..7d2b1092 --- /dev/null +++ b/src/perl/irc/IrcChannel.xs @@ -0,0 +1,44 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel PREFIX = irc_channel_ + +void +bans(channel) + Irssi::Irc::Channel channel +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Irc::Ban", 0); + for (tmp = channel->banlist; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +void +ebans(channel) + Irssi::Irc::Channel channel +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Irc::Ban", 0); + for (tmp = channel->ebanlist; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +void +invites(channel) + Irssi::Irc::Channel channel +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + for (tmp = channel->invitelist; tmp != NULL; tmp = tmp->next) { + XPUSHs(new_pv(tmp->data)); + } + +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_ + +Irssi::Irc::Channel +irc_channel_create(server, name, automatic) + Irssi::Irc::Server server + char *name + int automatic diff --git a/src/perl/irc/IrcQuery.xs b/src/perl/irc/IrcQuery.xs new file mode 100644 index 00000000..3df52e86 --- /dev/null +++ b/src/perl/irc/IrcQuery.xs @@ -0,0 +1,7 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_ + +Irssi::Irc::Query +irc_query_create(server, nick, automatic) + Irssi::Irc::Server server + char *nick + int automatic diff --git a/src/perl/irc/IrcServer.xs b/src/perl/irc/IrcServer.xs new file mode 100644 index 00000000..5f609605 --- /dev/null +++ b/src/perl/irc/IrcServer.xs @@ -0,0 +1,37 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server PREFIX = irc_server_ + +void +values(server) + Irssi::Irc::Server server +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + perl_server_fill_hash(hv, (SERVER_REC *) server); + + hv_store(hv, "real_address", 12, new_pv(server->real_address), 0); + hv_store(hv, "usermode", 8, new_pv(server->usermode), 0); + hv_store(hv, "userhost", 8, new_pv(server->userhost), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +char * +irc_server_get_channels(server) + Irssi::Irc::Server server + +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Connect PREFIX = irc_server_ + +void +values(conn) + Irssi::Irc::Connect conn +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + perl_server_connect_fill_hash(hv, (SERVER_CONNECT_REC *) conn); + + hv_store(hv, "alternate_nick", 14, new_pv(conn->alternate_nick), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +Irssi::Irc::Server +irc_server_connect(conn) + Irssi::Irc::Connect conn diff --git a/src/perl/irc/Makefile.PL.in b/src/perl/irc/Makefile.PL.in new file mode 100644 index 00000000..a3071c04 --- /dev/null +++ b/src/perl/irc/Makefile.PL.in @@ -0,0 +1,6 @@ +use ExtUtils::MakeMaker; + +WriteMakefile('NAME' => 'Irssi::Irc', + 'LIBS' => '', + 'INC' => '-I@top_srcdir@/src -I@top_srcdir@/src/core -I@top_srcdir@/src/irc/core -I@top_srcdir@/src/irc @GLIB_CFLAGS@', + 'VERSION_FROM' => '@srcdir@/Irc.pm'); diff --git a/src/perl/irc/Modes.xs b/src/perl/irc/Modes.xs new file mode 100644 index 00000000..ea26ceae --- /dev/null +++ b/src/perl/irc/Modes.xs @@ -0,0 +1,67 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc + +char * +modes_join(old, mode) + char *old + char *mode + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server +#******************************* + +void +channel_set_singlemode(server, channel, nicks, mode) + Irssi::Irc::Server server + char *channel + char *nicks + char *mode + +void +channel_set_mode(server, channel, mode) + Irssi::Irc::Server server + char *channel + char *mode + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Channel PREFIX = channel_ +#******************************* + +void +parse_channel_modes(channel, setby, modestr) + Irssi::Irc::Channel channel + char *setby + char *modestr + +Irssi::Irc::Ban +banlist_add(channel, ban, nick, time) + Irssi::Irc::Channel channel + char *ban + char *nick + time_t time + +void +banlist_remove(channel, ban) + Irssi::Irc::Channel channel + char *ban + +Irssi::Irc::Ban +banlist_exception_add(channel, ban, nick, time) + Irssi::Irc::Channel channel + char *ban + char *nick + time_t time + +void +banlist_exception_remove(channel, ban) + Irssi::Irc::Channel channel + char *ban + +void +invitelist_add(channel, mask) + Irssi::Irc::Channel channel + char *mask + +void +invitelist_remove(channel, mask) + Irssi::Irc::Channel channel + char *mask diff --git a/src/perl/irc/Netsplit.xs b/src/perl/irc/Netsplit.xs new file mode 100644 index 00000000..4dad9c1d --- /dev/null +++ b/src/perl/irc/Netsplit.xs @@ -0,0 +1,51 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server + +Irssi::Irc::Netsplit +netsplit_find(server, nick, address) + Irssi::Irc::Server server + char *nick + char *address + +Irssi::Nick +netsplit_find_channel(server, nick, address, channel) + Irssi::Irc::Server server + char *nick + char *address + char *channel + + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Netsplit +#******************************* + +void +values(netsplit) + Irssi::Irc::Netsplit netsplit +PREINIT: + HV *hv, *stash; +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, "destroy", 7, newSViv(netsplit->destroy), 0); + + stash = gv_stashpv("Irssi::Irc::Netsplitserver", 0); + hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(netsplit->server))), stash), 0); + /*FIXME: add GSList *channels;*/ + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Netsplitserver +#******************************* + +void +values(rec) + Irssi::Irc::Netsplitserver rec +PREINIT: + HV *hv; +PPCODE: + hv = newHV(); + hv_store(hv, "server", 6, new_pv(rec->server), 0); + hv_store(hv, "destserver", 10, new_pv(rec->destserver), 0); + hv_store(hv, "count", 5, newSViv(rec->count), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); diff --git a/src/perl/irc/Notifylist.xs b/src/perl/irc/Notifylist.xs new file mode 100644 index 00000000..4770aa12 --- /dev/null +++ b/src/perl/irc/Notifylist.xs @@ -0,0 +1,71 @@ +MODULE = Irssi::Irc PACKAGE = Irssi::Irc + +void +notifies() +PREINIT: + GSList *tmp; + HV *stash; +PPCODE: + stash = gv_stashpv("Irssi::Irc::Notifylist", 0); + for (tmp = notifies; tmp != NULL; tmp = tmp->next) { + XPUSHs(sv_2mortal(sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(tmp->data))), stash))); + } + +Irssi::Irc::Notifylist +notifylist_add(mask, ircnets, away_check, idle_check_time) + char *mask + char *ircnets + int away_check + int idle_check_time + +void +notifylist_remove(mask) + char *mask + +Irssi::Irc::Server +notifylist_ison(nick, serverlist) + char *nick + char *serverlist + +Irssi::Irc::Notifylist +notifylist_find(mask, ircnet) + char *mask + char *ircnet + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Server +#******************************* + +int +notifylist_ison_server(server, nick) + Irssi::Irc::Server server + char *nick + +#******************************* +MODULE = Irssi::Irc PACKAGE = Irssi::Irc::Notifylist PREFIX = notifylist_ +#******************************* + +void +values(notify) + Irssi::Irc::Notifylist notify +PREINIT: + HV *hv; + AV *av; + char **tmp; +PPCODE: + hv = newHV(); + hv_store(hv, "mask", 4, new_pv(notify->mask), 0); + hv_store(hv, "away_check", 10, newSViv(notify->away_check), 0); + hv_store(hv, "idle_check_time", 15, newSViv(notify->idle_check_time), 0); + + av = newAV(); + for (tmp = notify->ircnets; *tmp != NULL; tmp++) { + av_push(av, new_pv(*tmp)); + } + hv_store(hv, "ircnets", 7, newRV_noinc((SV*)av), 0); + XPUSHs(sv_2mortal(newRV_noinc((SV*)hv))); + +int +notifylist_ircnets_match(rec, ircnet) + Irssi::Irc::Notifylist rec + char *ircnet diff --git a/src/perl/irc/module.h b/src/perl/irc/module.h new file mode 100644 index 00000000..58a0b31f --- /dev/null +++ b/src/perl/irc/module.h @@ -0,0 +1,28 @@ +#include "../core/module.h" + +#include "irc-servers.h" +#include "irc-channels.h" +#include "irc-queries.h" + +#include "bans.h" +#include "modes.h" +#include "mode-lists.h" +#include "netsplit.h" +#include "ignore.h" + +#include "dcc/dcc.h" +#include "flood/autoignore.h" +#include "notifylist/notifylist.h" + +typedef IRC_SERVER_REC *Irssi__Irc__Server; +typedef IRC_SERVER_CONNECT_REC *Irssi__Irc__Connect; +typedef IRC_CHANNEL_REC *Irssi__Irc__Channel; +typedef QUERY_REC *Irssi__Irc__Query; + +typedef BAN_REC *Irssi__Irc__Ban; +typedef DCC_REC *Irssi__Irc__Dcc; +typedef NETSPLIT_REC *Irssi__Irc__Netsplit; +typedef NETSPLIT_SERVER_REC *Irssi__Irc__Netsplitserver; +typedef AUTOIGNORE_REC *Irssi__Irc__Autoignore; +typedef NOTIFYLIST_REC *Irssi__Irc__Notifylist; +typedef IGNORE_REC *Irssi__Irc__Ignore; diff --git a/src/perl/irc/typemap b/src/perl/irc/typemap new file mode 100644 index 00000000..58a8ce95 --- /dev/null +++ b/src/perl/irc/typemap @@ -0,0 +1,14 @@ +TYPEMAP +Irssi::Irc::Server T_PTROBJ +Irssi::Irc::Connect T_PTROBJ +Irssi::Irc::Channel T_PTROBJ +Irssi::Irc::Query T_PTROBJ +Irssi::Irc::Ban T_PTROBJ +Irssi::Irc::Dcc T_PTROBJ +Irssi::Irc::Netsplit T_PTROBJ +Irssi::Irc::Netsplitserver T_PTROBJ +Irssi::Irc::Autoignore T_PTROBJ +Irssi::Irc::Notifylist T_PTROBJ +Irssi::Irc::Ignore T_PTROBJ + +Irssi::Nick T_PTROBJ diff --git a/src/perl/irssi-perl.c b/src/perl/irssi-perl.c index c6efac8a..44dcd7b6 100644 --- a/src/perl/irssi-perl.c +++ b/src/perl/irssi-perl.c @@ -32,6 +32,7 @@ #include "signals.h" #include "commands.h" #include "misc.h" +#include "perl-common.h" /* For compatibility with perl 5.004 and older */ #ifndef ERRSV @@ -667,8 +668,9 @@ static void irssi_perl_autorun(void) void irssi_perl_init(void) { - perl_scripts = NULL; + perl_common_init(); + perl_scripts = NULL; command_bind("run", NULL, (SIGNAL_FUNC) cmd_run); command_bind_first("unload", NULL, (SIGNAL_FUNC) cmd_unload); command_bind("perlflush", NULL, (SIGNAL_FUNC) cmd_perlflush); @@ -682,6 +684,7 @@ void irssi_perl_init(void) void irssi_perl_deinit(void) { irssi_perl_stop(); + perl_common_deinit(); if (signal_grabbed) signal_remove("signal", (SIGNAL_FUNC) sig_signal); if (siglast_grabbed) signal_remove("last signal", (SIGNAL_FUNC) sig_lastsignal); diff --git a/src/perl/perl-common.c b/src/perl/perl-common.c new file mode 100644 index 00000000..ee4bc3c7 --- /dev/null +++ b/src/perl/perl-common.c @@ -0,0 +1,240 @@ +/* + perl-common.c : irssi + + Copyright (C) 2000 Timo Sirainen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#ifndef _SEM_SEMUN_UNDEFINED +#define HAS_UNION_SEMUN +#endif +#include + +#undef _ +#undef PACKAGE + +#include "module.h" +#include "modules.h" +#include "signals.h" + +#include "chat-protocols.h" +#include "servers.h" +#include "channels.h" +#include "queries.h" +#include "window-item-def.h" + +#include "perl-common.h" + +GHashTable *perl_stashes; + +HV *irssi_get_stash_item(int type, int chat_type) +{ + char *str; + + str = g_hash_table_lookup(perl_stashes, + GINT_TO_POINTER(type | (chat_type << 24))); + g_return_val_if_fail(str != NULL, gv_stashpv("", 0)); + return gv_stashpv(str, 1); +} + +void perl_connect_fill_hash(HV *hv, SERVER_CONNECT_REC *conn) +{ + char *type, *chat_type; + + type = "SERVER CONNECT"; + chat_type = (char *) chat_protocol_find_id(conn->chat_type)->name; + + hv_store(hv, "type", 4, new_pv(type), 0); + hv_store(hv, "chat_type", 9, new_pv(chat_type), 0); + + hv_store(hv, "address", 7, new_pv(conn->address), 0); + hv_store(hv, "port", 4, newSViv(conn->port), 0); + hv_store(hv, "chatnet", 7, new_pv(conn->chatnet), 0); + + hv_store(hv, "password", 8, new_pv(conn->password), 0); + hv_store(hv, "wanted_nick", 11, new_pv(conn->nick), 0); + hv_store(hv, "username", 8, new_pv(conn->username), 0); + hv_store(hv, "realname", 8, new_pv(conn->realname), 0); +} + +void perl_server_fill_hash(HV *hv, SERVER_REC *server) +{ + char *type, *chat_type; + HV *stash; + + perl_connect_fill_hash(hv, server->connrec); + + type = "SERVER"; + chat_type = (char *) chat_protocol_find_id(server->chat_type)->name; + + hv_store(hv, "type", 4, new_pv(type), 0); + hv_store(hv, "chat_type", 9, new_pv(chat_type), 0); + + hv_store(hv, "connect_time", 12, newSViv(server->connect_time), 0); + hv_store(hv, "real_connect_time", 17, newSViv(server->real_connect_time), 0); + + hv_store(hv, "tag", 3, new_pv(server->tag), 0); + hv_store(hv, "nick", 4, new_pv(server->nick), 0); + + hv_store(hv, "connected", 9, newSViv(server->connected), 0); + hv_store(hv, "connection_lost", 15, newSViv(server->connection_lost), 0); + + stash = gv_stashpv("Irssi::Rawlog", 0); + hv_store(hv, "rawlog", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(server->rawlog))), stash), 0); + + hv_store(hv, "version", 7, new_pv(server->version), 0); + hv_store(hv, "away_reason", 11, new_pv(server->away_reason), 0); + hv_store(hv, "last_invite", 11, new_pv(server->last_invite), 0); + hv_store(hv, "server_operator", 15, newSViv(server->server_operator), 0); + hv_store(hv, "usermode_away", 13, newSViv(server->usermode_away), 0); + hv_store(hv, "banned", 6, newSViv(server->banned), 0); + + hv_store(hv, "lag", 3, newSViv(server->lag), 0); +} + +void perl_window_item_fill_hash(HV *hv, WI_ITEM_REC *item) +{ + char *type, *chat_type; + + type = (char *) module_find_id_str("WINDOW ITEM", item->type); + chat_type = (char *) chat_protocol_find_id(item->chat_type)->name; + + hv_store(hv, "type", 4, new_pv(type), 0); + hv_store(hv, "chat_type", 9, new_pv(chat_type), 0); + + if (item->server != NULL) { + hv_store(hv, "server", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(item->server))), + irssi_get_stash(item->server)), 0); + } + hv_store(hv, "name", 4, new_pv(item->name), 0); + + hv_store(hv, "createtime", 10, newSViv(item->createtime), 0); + hv_store(hv, "new_data", 8, newSViv(item->new_data), 0); + hv_store(hv, "last_color", 10, newSViv(item->last_color), 0); +} + +void perl_channel_fill_hash(HV *hv, CHANNEL_REC *channel) +{ + perl_window_item_fill_hash(hv, (WI_ITEM_REC *) channel); + + hv_store(hv, "topic", 5, new_pv(channel->topic), 0); + + hv_store(hv, "no_modes", 8, newSViv(channel->no_modes), 0); + hv_store(hv, "mode", 4, new_pv(channel->mode), 0); + hv_store(hv, "limit", 5, newSViv(channel->limit), 0); + hv_store(hv, "key", 3, new_pv(channel->key), 0); + + hv_store(hv, "chanop", 6, newSViv(channel->chanop), 0); + hv_store(hv, "names_got", 9, newSViv(channel->names_got), 0); + hv_store(hv, "wholist", 7, newSViv(channel->wholist), 0); + hv_store(hv, "synced", 6, newSViv(channel->synced), 0); + + hv_store(hv, "joined", 6, newSViv(channel->joined), 0); + hv_store(hv, "left", 4, newSViv(channel->left), 0); + hv_store(hv, "kicked", 6, newSViv(channel->kicked), 0); +} + +void perl_query_fill_hash(HV *hv, QUERY_REC *query) +{ + perl_window_item_fill_hash(hv, (WI_ITEM_REC *) query); + + hv_store(hv, "address", 7, new_pv(query->address), 0); + hv_store(hv, "server_tag", 10, new_pv(query->server_tag), 0); + hv_store(hv, "unwanted", 8, newSViv(query->unwanted), 0); +} + +static void perl_register_protocol(CHAT_PROTOCOL_REC *rec) +{ + char *name, stash[100]; + int type, chat_type; + + chat_type = chat_protocol_lookup(rec->name); + g_return_if_fail(chat_type >= 0); + + name = g_strdup(rec->name); + g_strdown(name+1); + + /* window items: channel, query */ + type = module_get_uniq_id_str("WINDOW ITEM TYPE", "CHANNEL"); + g_snprintf(stash, sizeof(stash), "Irssi::%s::Channel", name); + irssi_add_stash(type, chat_type, stash); + + type = module_get_uniq_id_str("WINDOW ITEM TYPE", "QUERY"); + g_snprintf(stash, sizeof(stash), "Irssi::%s::Query", name); + irssi_add_stash(type, chat_type, stash); + + /* server specific */ + type = module_get_uniq_id("SERVER", 0); + g_snprintf(stash, sizeof(stash), "Irssi::%s::Server", name); + irssi_add_stash(type, chat_type, stash); + + type = module_get_uniq_id("SERVER CONNECT", 0); + g_snprintf(stash, sizeof(stash), "Irssi::%s::Connect", name); + irssi_add_stash(type, chat_type, stash); + + g_free(name); +} + +static int perl_free_protocol(void *key, void *value, void *chat_type) +{ + if ((GPOINTER_TO_INT(key) >> 24) == GPOINTER_TO_INT(chat_type)) { + g_free(value); + return TRUE; + } + + return FALSE; +} + +static void perl_unregister_protocol(CHAT_PROTOCOL_REC *rec) +{ + g_hash_table_foreach_remove(perl_stashes, (GHRFunc) perl_free_protocol, + GINT_TO_POINTER(rec->id)); +} + +static void free_perl_stash(void *key, void *value) +{ + g_free(value); +} + +static void sig_protocol_created(CHAT_PROTOCOL_REC *rec) +{ + perl_register_protocol(rec); +} + +static void sig_protocol_destroyed(CHAT_PROTOCOL_REC *rec) +{ + perl_unregister_protocol(rec); +} + +void perl_common_init(void) +{ + perl_stashes = g_hash_table_new((GHashFunc) g_direct_hash, + (GCompareFunc) g_direct_equal); + g_slist_foreach(chat_protocols, (GFunc) perl_register_protocol, NULL); + + signal_add("chat protocol created", (SIGNAL_FUNC) sig_protocol_created); + signal_add("chat protocol destroyed", (SIGNAL_FUNC) sig_protocol_destroyed); +} + +void perl_common_deinit(void) +{ + g_hash_table_foreach(perl_stashes, (GHFunc) free_perl_stash, NULL); + g_hash_table_destroy(perl_stashes); + + signal_remove("chat protocol created", (SIGNAL_FUNC) sig_protocol_created); + signal_remove("chat protocol destroyed", (SIGNAL_FUNC) sig_protocol_destroyed); +} diff --git a/src/perl/perl-common.h b/src/perl/perl-common.h new file mode 100644 index 00000000..c5eb9748 --- /dev/null +++ b/src/perl/perl-common.h @@ -0,0 +1,21 @@ +#ifndef __PERL_COMMON_H +#define __PERL_COMMON_H + +#define new_pv(a) \ + (newSVpv((a) == NULL ? "" : (a), (a) == NULL ? 0 : strlen(a))) + +extern GHashTable *perl_stashes; + +HV *irssi_get_stash_item(int type, int chat_type); + +#define irssi_get_stash(item) \ + irssi_get_stash_item((item)->type, (item)->chat_type) + +#define irssi_add_stash(type, chat_type, stash) \ + g_hash_table_insert(perl_stashes, GINT_TO_POINTER(type | \ + (chat_type << 24)), g_strdup(stash)) + +void perl_common_init(void); +void perl_common_deinit(void); + +#endif