1
0
mirror of https://github.com/irssi/irssi.git synced 2024-06-30 02:45:25 -04:00

Introduce some more chantypes awareness

This commit is contained in:
LemonBoy 2015-09-02 21:50:40 +02:00
parent 35d30c19a1
commit 57d645f246
2 changed files with 46 additions and 22 deletions

View File

@ -42,6 +42,9 @@
#include "fe-windows.h"
#include "fe-irc-server.h"
int fe_channel_is_opchannel(IRC_SERVER_REC *server, const char *target);
const char *fe_channel_skip_prefix(IRC_SERVER_REC *server, const char *target);
static void event_privmsg(IRC_SERVER_REC *server, const char *data,
const char *nick, const char *addr)
{
@ -52,12 +55,14 @@ static void event_privmsg(IRC_SERVER_REC *server, const char *data,
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
if (nick == NULL) nick = server->real_address;
if (addr == NULL) addr = "";
if (*target == '@' && server_ischannel(SERVER(server), &target[1])) {
if (fe_channel_is_opchannel(server, target)) {
/* Hybrid 6 feature, send msg to all ops in channel */
recoded = recode_in(SERVER(server), msg, target+1);
target = (char *)fe_channel_skip_prefix(server, target);
recoded = recode_in(SERVER(server), msg, target);
signal_emit("message irc op_public", 5,
server, recoded, nick, addr,
get_visible_target(server, target+1));
get_visible_target(server, target));
} else {
recoded = recode_in(SERVER(server), msg, server_ischannel(SERVER(server), target) ? target : nick);
signal_emit(server_ischannel(SERVER(server), target) ?

View File

@ -37,28 +37,47 @@
#include "fe-queries.h"
#include "window-items.h"
static const char *skip_target(IRC_SERVER_REC *server, const char *target)
int fe_channel_is_opchannel(IRC_SERVER_REC *server, const char *target)
{
int i = 0;
const char *val, *chars;
const char *statusmsg;
/* Quick check */
if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0)
return FALSE;
statusmsg = g_hash_table_lookup(server->isupport, "statusmsg");
if (statusmsg == NULL)
statusmsg = "@+";
return strchr(statusmsg, *target) != NULL;
}
const char *fe_channel_skip_prefix(IRC_SERVER_REC *server, const char *target)
{
const char *statusmsg;
/* Quick check */
if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0)
return target;
/* Exit early if target doesn't name a channel */
if (server_ischannel(SERVER(server), target) == FALSE)
return FALSE;
statusmsg = g_hash_table_lookup(server->isupport, "statusmsg");
/* Hack: for bahamut 1.4 which sends neither STATUSMSG nor
* WALLCHOPS in 005, accept @#chan and @+#chan (but not +#chan) */
val = g_hash_table_lookup(server->isupport, "STATUSMSG");
if (val == NULL && *target != '@')
if (statusmsg == NULL && *target != '@')
return target;
chars = val ? val : "@+";
for(i = 0; target[i] != '\0'; i++) {
if (strchr(chars, target[i]) == NULL)
break;
};
if(server_ischannel(SERVER(server), &target[i]))
target += i;
if (statusmsg == NULL)
statusmsg = "@+";
/* Strip the leading statusmsg prefixes */
while (strchr(statusmsg, *target) != NULL) {
target++;
}
return target;
}
@ -72,7 +91,7 @@ static void sig_message_own_public(SERVER_REC *server, const char *msg,
if (!IS_IRC_SERVER(server))
return;
oldtarget = target;
target = skip_target(IRC_SERVER(server), target);
target = fe_channel_skip_prefix(IRC_SERVER(server), target);
if (target != oldtarget) {
/* Hybrid 6 / Bahamut feature, send msg to all
ops / ops+voices in channel */
@ -135,7 +154,7 @@ static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg,
char *freemsg = NULL;
oldtarget = target;
target = skip_target(IRC_SERVER(server), target);
target = fe_channel_skip_prefix(IRC_SERVER(server), target);
if (server_ischannel(SERVER(server), target))
item = irc_channel_find(server, target);
else
@ -163,7 +182,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg,
int own = FALSE;
oldtarget = target;
target = skip_target(IRC_SERVER(server), target);
target = fe_channel_skip_prefix(IRC_SERVER(server), target);
level = MSGLEVEL_ACTIONS |
(server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS);
@ -219,7 +238,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg,
static void sig_message_own_notice(IRC_SERVER_REC *server, const char *msg,
const char *target)
{
printformat(server, skip_target(server, target), MSGLEVEL_NOTICES |
printformat(server, fe_channel_skip_prefix(server, target), MSGLEVEL_NOTICES |
MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT,
IRCTXT_OWN_NOTICE, target, msg);
}
@ -232,7 +251,7 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg,
int level = MSGLEVEL_NOTICES;
oldtarget = target;
target = skip_target(IRC_SERVER(server), target);
target = fe_channel_skip_prefix(IRC_SERVER(server), target);
if (address == NULL || *address == '\0') {
/* notice from server */
@ -270,7 +289,7 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg,
static void sig_message_own_ctcp(IRC_SERVER_REC *server, const char *cmd,
const char *data, const char *target)
{
printformat(server, skip_target(server, target), MSGLEVEL_CTCPS |
printformat(server, fe_channel_skip_prefix(server, target), MSGLEVEL_CTCPS |
MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT,
IRCTXT_OWN_CTCP, target, cmd, data);
}
@ -282,7 +301,7 @@ static void sig_message_irc_ctcp(IRC_SERVER_REC *server, const char *cmd,
const char *oldtarget;
oldtarget = target;
target = skip_target(server, target);
target = fe_channel_skip_prefix(server, target);
printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS,
IRCTXT_CTCP_REQUESTED, nick, addr, cmd, data, oldtarget);
}