Add /ban, /unban and handle ban list replies
parent
2a33ee68dd
commit
56de4668ac
|
@ -1,4 +1,4 @@
|
||||||
.Dd February 16, 2020
|
.Dd February 19, 2020
|
||||||
.Dt CATGIRL 1
|
.Dt CATGIRL 1
|
||||||
.Os
|
.Os
|
||||||
.
|
.
|
||||||
|
@ -242,6 +242,8 @@ can be typed
|
||||||
.Bl -tag -width Ds
|
.Bl -tag -width Ds
|
||||||
.It Ic /away Op Ar message
|
.It Ic /away Op Ar message
|
||||||
Set or clear your away status.
|
Set or clear your away status.
|
||||||
|
.It Ic /ban Op Ar mask ...
|
||||||
|
List or ban masks from the channel.
|
||||||
.It Ic /cs Ar command
|
.It Ic /cs Ar command
|
||||||
Send a command to ChanServ.
|
Send a command to ChanServ.
|
||||||
.It Ic /invite Ar nick
|
.It Ic /invite Ar nick
|
||||||
|
@ -274,6 +276,8 @@ Quit IRC.
|
||||||
Send a raw IRC command.
|
Send a raw IRC command.
|
||||||
.It Ic /topic Op Ar topic
|
.It Ic /topic Op Ar topic
|
||||||
Show or set the topic of the channel.
|
Show or set the topic of the channel.
|
||||||
|
.It Ic /unban Ar mask ...
|
||||||
|
Unban masks from the channel.
|
||||||
.It Ic /whois Ar nick
|
.It Ic /whois Ar nick
|
||||||
Query information about a user.
|
Query information about a user.
|
||||||
.El
|
.El
|
||||||
|
|
1
chat.h
1
chat.h
|
@ -175,6 +175,7 @@ static inline void utilPush(struct Util *util, const char *arg) {
|
||||||
|
|
||||||
extern struct Replies {
|
extern struct Replies {
|
||||||
uint away;
|
uint away;
|
||||||
|
uint ban;
|
||||||
uint join;
|
uint join;
|
||||||
uint list;
|
uint list;
|
||||||
uint names;
|
uint names;
|
||||||
|
|
26
command.c
26
command.c
|
@ -143,6 +143,30 @@ static void commandKick(uint id, char *params) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void commandBan(uint id, char *params) {
|
||||||
|
if (params) {
|
||||||
|
int count = 1;
|
||||||
|
for (char *ch = params; *ch; ++ch) {
|
||||||
|
if (*ch == ' ') count++;
|
||||||
|
}
|
||||||
|
char b[ParamCap - 2] = "bbbbbbbbbbbbb";
|
||||||
|
ircFormat("MODE %s +%.*s %s\r\n", idNames[id], count, b, params);
|
||||||
|
} else {
|
||||||
|
ircFormat("MODE %s +b\r\n", idNames[id]);
|
||||||
|
replies.ban++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void commandUnban(uint id, char *params) {
|
||||||
|
if (!params) return;
|
||||||
|
int count = 1;
|
||||||
|
for (char *ch = params; *ch; ++ch) {
|
||||||
|
if (*ch == ' ') count++;
|
||||||
|
}
|
||||||
|
char b[ParamCap - 2] = "bbbbbbbbbbbbb";
|
||||||
|
ircFormat("MODE %s -%.*s %s\r\n", idNames[id], count, b, params);
|
||||||
|
}
|
||||||
|
|
||||||
static void commandList(uint id, char *params) {
|
static void commandList(uint id, char *params) {
|
||||||
(void)id;
|
(void)id;
|
||||||
if (params) {
|
if (params) {
|
||||||
|
@ -264,6 +288,7 @@ static const struct Handler {
|
||||||
bool restricted;
|
bool restricted;
|
||||||
} Commands[] = {
|
} Commands[] = {
|
||||||
{ "/away", .fn = commandAway },
|
{ "/away", .fn = commandAway },
|
||||||
|
{ "/ban", .fn = commandBan },
|
||||||
{ "/close", .fn = commandClose },
|
{ "/close", .fn = commandClose },
|
||||||
{ "/copy", .fn = commandCopy, .restricted = true },
|
{ "/copy", .fn = commandCopy, .restricted = true },
|
||||||
{ "/cs", .fn = commandCS },
|
{ "/cs", .fn = commandCS },
|
||||||
|
@ -287,6 +312,7 @@ static const struct Handler {
|
||||||
{ "/quit", .fn = commandQuit },
|
{ "/quit", .fn = commandQuit },
|
||||||
{ "/quote", .fn = commandQuote, .restricted = true },
|
{ "/quote", .fn = commandQuote, .restricted = true },
|
||||||
{ "/topic", .fn = commandTopic },
|
{ "/topic", .fn = commandTopic },
|
||||||
|
{ "/unban", .fn = commandUnban },
|
||||||
{ "/whois", .fn = commandWhois },
|
{ "/whois", .fn = commandWhois },
|
||||||
{ "/window", .fn = commandWindow },
|
{ "/window", .fn = commandWindow },
|
||||||
};
|
};
|
||||||
|
|
31
handle.c
31
handle.c
|
@ -424,6 +424,35 @@ static void handleTopic(struct Message *msg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handleReplyBanList(struct Message *msg) {
|
||||||
|
require(msg, false, 3);
|
||||||
|
if (!replies.ban) return;
|
||||||
|
uint id = idFor(msg->params[1]);
|
||||||
|
if (msg->params[3] && msg->params[4]) {
|
||||||
|
char since[sizeof("0000-00-00 00:00:00")];
|
||||||
|
time_t time = strtol(msg->params[4], NULL, 10);
|
||||||
|
strftime(since, sizeof(since), "%F %T", localtime(&time));
|
||||||
|
uiFormat(
|
||||||
|
id, Cold, tagTime(msg),
|
||||||
|
"Banned in \3%02d%s\3 by \3%02d%s\3 since %s: %s",
|
||||||
|
hash(msg->params[1]), msg->params[1],
|
||||||
|
completeColor(id, msg->params[3]), msg->params[3], since,
|
||||||
|
msg->params[2]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
uiFormat(
|
||||||
|
id, Cold, tagTime(msg),
|
||||||
|
"Banned in \3%02d%s\3: %s",
|
||||||
|
hash(msg->params[1]), msg->params[1], msg->params[2]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handleReplyEndOfBanList(struct Message *msg) {
|
||||||
|
(void)msg;
|
||||||
|
if (replies.ban) replies.ban--;
|
||||||
|
}
|
||||||
|
|
||||||
static void handleInvite(struct Message *msg) {
|
static void handleInvite(struct Message *msg) {
|
||||||
require(msg, true, 2);
|
require(msg, true, 2);
|
||||||
if (!strcmp(msg->params[0], self.nick)) {
|
if (!strcmp(msg->params[0], self.nick)) {
|
||||||
|
@ -719,6 +748,8 @@ static const struct Handler {
|
||||||
{ "332", handleReplyTopic },
|
{ "332", handleReplyTopic },
|
||||||
{ "353", handleReplyNames },
|
{ "353", handleReplyNames },
|
||||||
{ "366", handleReplyEndOfNames },
|
{ "366", handleReplyEndOfNames },
|
||||||
|
{ "367", handleReplyBanList },
|
||||||
|
{ "368", handleReplyEndOfBanList },
|
||||||
{ "372", handleReplyMOTD },
|
{ "372", handleReplyMOTD },
|
||||||
{ "378", handleReplyWhoisGeneric },
|
{ "378", handleReplyWhoisGeneric },
|
||||||
{ "379", handleReplyWhoisGeneric },
|
{ "379", handleReplyWhoisGeneric },
|
||||||
|
|
Loading…
Reference in New Issue