Handle MODE setting channel prefix modes
parent
a5cd2cd97a
commit
c2c8595012
41
handle.c
41
handle.c
|
@ -240,6 +240,7 @@ static void handleReplyISupport(struct Message *msg) {
|
||||||
strsep(&msg->params[i], "(");
|
strsep(&msg->params[i], "(");
|
||||||
set(&network.prefixModes, strsep(&msg->params[i], ")"));
|
set(&network.prefixModes, strsep(&msg->params[i], ")"));
|
||||||
set(&network.prefixes, msg->params[i]);
|
set(&network.prefixes, msg->params[i]);
|
||||||
|
assert(strlen(network.prefixes) == strlen(network.prefixModes));
|
||||||
} else if (!strcmp(key, "CHANMODES")) {
|
} else if (!strcmp(key, "CHANMODES")) {
|
||||||
set(&network.listModes, strsep(&msg->params[i], ","));
|
set(&network.listModes, strsep(&msg->params[i], ","));
|
||||||
set(&network.paramModes, strsep(&msg->params[i], ","));
|
set(&network.paramModes, strsep(&msg->params[i], ","));
|
||||||
|
@ -484,6 +485,45 @@ static void handleTopic(struct Message *msg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handleMode(struct Message *msg) {
|
||||||
|
require(msg, true, 2);
|
||||||
|
if (!strchr(network.chanTypes, msg->params[0][0])) {
|
||||||
|
// TODO: User mode changes.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint id = idFor(msg->params[0]);
|
||||||
|
bool set = false;
|
||||||
|
uint param = 2;
|
||||||
|
for (char *ch = msg->params[1]; *ch; ++ch) {
|
||||||
|
if (*ch == '+') {
|
||||||
|
set = true;
|
||||||
|
} else if (*ch == '-') {
|
||||||
|
set = false;
|
||||||
|
} else if (strchr(network.prefixModes, *ch)) {
|
||||||
|
assert(param < ParamCap);
|
||||||
|
char *nick = msg->params[param++];
|
||||||
|
char *mode = strchr(network.prefixModes, *ch);
|
||||||
|
char prefix = network.prefixes[mode - network.prefixModes];
|
||||||
|
// TODO: Invert nick if targeting self?
|
||||||
|
uiFormat(
|
||||||
|
id, (!strcmp(nick, self.nick) ? Hot : Cold), tagTime(msg),
|
||||||
|
"\3%02d%s\3\t%s \3%02d%c%s\3",
|
||||||
|
hash(msg->user), msg->nick,
|
||||||
|
(set ? "grants" : "revokes"),
|
||||||
|
completeColor(id, nick), prefix, nick
|
||||||
|
);
|
||||||
|
} else if (strchr(network.listModes, *ch)) {
|
||||||
|
// TODO
|
||||||
|
} else if (strchr(network.paramModes, *ch)) {
|
||||||
|
// TODO
|
||||||
|
} else if (strchr(network.setParamModes, *ch)) {
|
||||||
|
// TODO
|
||||||
|
} else {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void handleErrorUserNotInChannel(struct Message *msg) {
|
static void handleErrorUserNotInChannel(struct Message *msg) {
|
||||||
require(msg, false, 4);
|
require(msg, false, 4);
|
||||||
uiFormat(
|
uiFormat(
|
||||||
|
@ -828,6 +868,7 @@ static const struct Handler {
|
||||||
{ "INVITE", handleInvite },
|
{ "INVITE", handleInvite },
|
||||||
{ "JOIN", handleJoin },
|
{ "JOIN", handleJoin },
|
||||||
{ "KICK", handleKick },
|
{ "KICK", handleKick },
|
||||||
|
{ "MODE", handleMode },
|
||||||
{ "NICK", handleNick },
|
{ "NICK", handleNick },
|
||||||
{ "NOTICE", handlePrivmsg },
|
{ "NOTICE", handlePrivmsg },
|
||||||
{ "PART", handlePart },
|
{ "PART", handlePart },
|
||||||
|
|
Loading…
Reference in New Issue