1
0
mirror of https://github.com/irssi/irssi.git synced 2024-09-15 04:28:09 -04:00

Added ctcp_register() and ctcp_unregister() for registering CTCP commands.

It's used by CTCP CLIENTINFO to print list of known CTCP commands. Also
added CTCP USERINFO command + /SET ctcp_userinfo_reply.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2063 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2001-11-18 21:36:11 +00:00 committed by cras
parent 7433dafcb1
commit 5ee08ed3c9
6 changed files with 146 additions and 16 deletions

View File

@ -29,6 +29,59 @@
#include "servers-idle.h"
#include "ignore.h"
typedef struct {
char *name;
int refcount;
} CTCP_CMD_REC;
static GSList *ctcp_cmds;
static CTCP_CMD_REC *ctcp_cmd_find(const char *name)
{
GSList *tmp;
for (tmp = ctcp_cmds; tmp != NULL; tmp = tmp->next) {
CTCP_CMD_REC *rec = tmp->data;
if (g_strcasecmp(rec->name, name) == 0)
return rec;
}
return NULL;
}
void ctcp_register(const char *name)
{
CTCP_CMD_REC *rec;
rec = ctcp_cmd_find(name);
if (rec == NULL) {
rec = g_new0(CTCP_CMD_REC, 1);
rec->name = g_strdup(name);
g_strup(rec->name);
ctcp_cmds = g_slist_append(ctcp_cmds, rec);
}
rec->refcount++;
}
static void ctcp_cmd_destroy(CTCP_CMD_REC *rec)
{
ctcp_cmds = g_slist_remove(ctcp_cmds, rec);
g_free(rec->name);
g_free(rec);
}
void ctcp_unregister(const char *name)
{
CTCP_CMD_REC *rec;
rec = ctcp_cmd_find(name);
if (rec != NULL && --rec->refcount == 0)
ctcp_cmd_destroy(rec);
}
static void ctcp_queue_clean(IRC_SERVER_REC *server)
{
GSList *tmp, *next;
@ -92,24 +145,33 @@ static void ctcp_ping(IRC_SERVER_REC *server, const char *data,
g_free(str);
}
/* CTCP version */
static void ctcp_version(IRC_SERVER_REC *server, const char *data,
const char *nick)
static void ctcp_send_parsed_reply(IRC_SERVER_REC *server, const char *nick,
const char *cmd, const char *args)
{
char *str, *reply;
char *str, *pstr;
g_return_if_fail(server != NULL);
g_return_if_fail(nick != NULL);
reply = parse_special_string(settings_get_str("ctcp_version_reply"),
SERVER(server), NULL, "", NULL, 0);
str = g_strdup_printf("NOTICE %s :\001VERSION %s\001", nick, reply);
if (*args == '\0')
return;
pstr = parse_special_string(args, SERVER(server), NULL, "", NULL, 0);
str = g_strdup_printf("NOTICE %s :\001%s %s\001", nick, cmd, pstr);
ctcp_send_reply(server, str);
g_free(str);
g_free(reply);
g_free(pstr);
}
/* CTCP version */
static void ctcp_version(IRC_SERVER_REC *server, const char *data,
const char *nick)
{
ctcp_send_parsed_reply(server, nick, "VERSION",
settings_get_str("ctcp_version_reply"));
}
/* CTCP time */
static void ctcp_time(IRC_SERVER_REC *server, const char *data,
const char *nick)
{
@ -125,6 +187,38 @@ static void ctcp_time(IRC_SERVER_REC *server, const char *data,
g_free(reply);
}
/* CTCP userinfo */
static void ctcp_userinfo(IRC_SERVER_REC *server, const char *data,
const char *nick)
{
ctcp_send_parsed_reply(server, nick, "USERINFO",
settings_get_str("ctcp_userinfo_reply"));
}
/* CTCP clientinfo */
static void ctcp_clientinfo(IRC_SERVER_REC *server, const char *data,
const char *nick)
{
GString *str;
GSList *tmp;
g_return_if_fail(server != NULL);
g_return_if_fail(nick != NULL);
str = g_string_new(NULL);
g_string_sprintf(str, "NOTICE %s :\001CLIENTINFO", nick);
for (tmp = ctcp_cmds; tmp != NULL; tmp = tmp->next) {
CTCP_CMD_REC *rec = tmp->data;
g_string_append_c(str, ' ');
g_string_append(str, rec->name);
}
g_string_append_c(str, '\001');
ctcp_send_reply(server, str->str);
g_string_free(str, TRUE);
}
static void ctcp_msg(IRC_SERVER_REC *server, const char *data,
const char *nick, const char *addr, const char *target)
{
@ -221,8 +315,11 @@ static void sig_disconnected(IRC_SERVER_REC *server)
void ctcp_init(void)
{
ctcp_cmds = NULL;
settings_add_str("misc", "ctcp_version_reply",
PACKAGE" v$J - running on $sysname $sysarch");
settings_add_str("misc", "ctcp_userinfo_reply", "$Y");
settings_add_int("flood", "max_ctcp_queue", 5);
signal_add("server disconnected", (SIGNAL_FUNC) sig_disconnected);
@ -233,10 +330,21 @@ void ctcp_init(void)
signal_add("ctcp msg ping", (SIGNAL_FUNC) ctcp_ping);
signal_add("ctcp msg version", (SIGNAL_FUNC) ctcp_version);
signal_add("ctcp msg time", (SIGNAL_FUNC) ctcp_time);
signal_add("ctcp msg userinfo", (SIGNAL_FUNC) ctcp_userinfo);
signal_add("ctcp msg clientinfo", (SIGNAL_FUNC) ctcp_clientinfo);
ctcp_register("ping");
ctcp_register("version");
ctcp_register("time");
ctcp_register("userinfo");
ctcp_register("clientinfo");
}
void ctcp_deinit(void)
{
while (ctcp_cmds != NULL)
ctcp_cmd_destroy(ctcp_cmds->data);
signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);
signal_remove("event privmsg", (SIGNAL_FUNC) event_privmsg);
signal_remove("event notice", (SIGNAL_FUNC) event_notice);
@ -245,4 +353,6 @@ void ctcp_deinit(void)
signal_remove("ctcp msg ping", (SIGNAL_FUNC) ctcp_ping);
signal_remove("ctcp msg version", (SIGNAL_FUNC) ctcp_version);
signal_remove("ctcp msg time", (SIGNAL_FUNC) ctcp_time);
signal_remove("ctcp msg userinfo", (SIGNAL_FUNC) ctcp_userinfo);
signal_remove("ctcp msg clientinfo", (SIGNAL_FUNC) ctcp_clientinfo);
}

View File

@ -1,10 +1,14 @@
#ifndef __CTCP_H
#define __CTCP_H
/* Register/unregister CTCP command, so it shows in CTCP CLIENTINFO */
void ctcp_register(const char *name);
void ctcp_unregister(const char *name);
/* Send CTCP reply with flood protection */
void ctcp_send_reply(SERVER_REC *server, const char *data);
void ctcp_init(void);
void ctcp_deinit(void);
/* Send CTCP reply with flood protection */
void ctcp_send_reply(SERVER_REC *server, gchar *data);
#endif

View File

@ -92,6 +92,7 @@ irc_sources = \
irc/Irc.pm \
irc/Dcc.xs \
irc/Channel.xs \
irc/Ctcp.xs \
irc/Query.xs \
irc/Server.xs \
irc/Modes.xs \

19
src/perl/irc/Ctcp.xs Normal file
View File

@ -0,0 +1,19 @@
#include "module.h"
MODULE = Irssi::Irc::Ctcp PACKAGE = Irssi
PROTOTYPES: ENABLE
void
ctcp_register(name)
char *name
void
ctcp_unregister(name)
char *name
MODULE = Irssi::Irc::Ctcp PACKAGE = Irssi::Irc::Server PREFIX = irc_server_
void
ctcp_send_reply(server, data)
Irssi::Irc::Server server
char *data

View File

@ -184,6 +184,7 @@ CODE:
BOOT:
irssi_boot(Irc__Channel);
irssi_boot(Irc__Ctcp);
irssi_boot(Irc__Dcc);
irssi_boot(Irc__Modes);
irssi_boot(Irc__Netsplit);

View File

@ -73,11 +73,6 @@ send_raw_split(server, cmd, nickarg, max_nicks)
CODE:
irc_send_cmd_split(server, cmd, nickarg, max_nicks);
void
ctcp_send_reply(server, data)
Irssi::Irc::Server server
char *data
MODULE = Irssi::Irc::Server PACKAGE = Irssi::Irc::Server PREFIX = server_
void