added /WHO for user list and other fixes

This commit is contained in:
Aaron Blakely 2024-02-16 22:54:16 -06:00
parent 6db8e620b1
commit 2ee7d7d1fb
5 changed files with 92 additions and 18 deletions

View File

@ -17,12 +17,16 @@
#define CHAN_PRIV_OWNER "~" #define CHAN_PRIV_OWNER "~"
#define CHAN_PRIV_ADMIN "&" #define CHAN_PRIV_ADMIN "&"
// debug 352: chan: #bbsn, user: ~shadow, host: services.ephasic.org, server: memphis.ephasic.org, nick: Shadow, flags: H*, realname: shadow
struct user struct user
{ {
char nick[50]; char nick[50];
char user[50];
char host[256]; char host[256];
char real_name[512]; char real_name[512];
char server[256];
#ifdef _WIN32 #ifdef _WIN32
BOOL is_op; BOOL is_op;
BOOL is_halfop; BOOL is_halfop;
@ -52,6 +56,9 @@ void add_user_to_channel(char *user, char *host, char *chan);
void remove_user_from_channel(char *user, char *chan); void remove_user_from_channel(char *user, char *chan);
void update_nick(char *old_nick, char *new_nick); void update_nick(char *old_nick, char *new_nick);
void update_host(char *nick, char *host); void update_host(char *nick, char *host);
void update_user(char *nick, char *user);
void update_server(char *nick, char *server);
void update_realname(char *nick, char *real_name);
void user_quit(char *nick); void user_quit(char *nick);
void set_realname(char *nick, char *real_name); void set_realname(char *nick, char *real_name);

View File

@ -18,6 +18,7 @@
#define IRC_MOTD "372" #define IRC_MOTD "372"
#define IRC_END_MOTD "376" #define IRC_END_MOTD "376"
#define IRC_NAMREPLY "353" #define IRC_NAMREPLY "353"
#define IRC_WHOREPLY "352"
struct ev_handler struct ev_handler
{ {

View File

@ -71,9 +71,6 @@ void add_user_to_channel(char *user, char *host, char *chan)
return; return;
} }
if (user_exists(chan, user) == 1)
return;
// parse mode prefix symbols and remove them // parse mode prefix symbols and remove them
if (user[0] == '@') if (user[0] == '@')
{ {
@ -101,6 +98,9 @@ void add_user_to_channel(char *user, char *host, char *chan)
user++; user++;
} }
if (user_exists(chan, user) == 1)
return;
printf("Adding user %s!%s to channel %s\n", user, host, chan); printf("Adding user %s!%s to channel %s\n", user, host, chan);
for (i = 0; i < chan_count; i++) for (i = 0; i < chan_count; i++)
@ -180,6 +180,53 @@ void update_host(char *nick, char *host)
} }
} }
void update_user(char *nick, char *user)
{
int i, j;
for (i = 0; i < chan_count; i++)
{
for (j = 0; j < channels[i]->user_count; j++)
{
if (!strcmp(channels[i]->users[j].nick, nick))
{
strlcpy(channels[i]->users[j].user, user, 50);
}
}
}
}
void update_server(char *nick, char *server)
{
int i, j;
for (i = 0; i < chan_count; i++)
{
for (j = 0; j < channels[i]->user_count; j++)
{
if (!strcmp(channels[i]->users[j].nick, nick))
{
strlcpy(channels[i]->users[j].server, server, 256);
}
}
}
}
void update_realname(char *nick, char *real_name)
{
int i, j;
for (i = 0; i < chan_count; i++)
{
for (j = 0; j < channels[i]->user_count; j++)
{
if (!strcmp(channels[i]->users[j].nick, nick))
{
strlcpy(channels[i]->users[j].real_name, real_name, 256);
}
}
}
}
void user_quit(char *nick) void user_quit(char *nick)
{ {

View File

@ -44,6 +44,7 @@ void init_events()
init_event_type(NICK_INUSE); init_event_type(NICK_INUSE);
init_event_type(CTCP); init_event_type(CTCP);
init_event_type(IRC_NAMREPLY); init_event_type(IRC_NAMREPLY);
init_event_type(IRC_WHOREPLY);
} }
MY_API int add_handler(char *type, void *handler) MY_API int add_handler(char *type, void *handler)

View File

@ -147,6 +147,8 @@ void irc_raw(struct irc_conn *bot, char *fmt, ...)
vsnprintf(bot->out, sizeof bot->out, fmt, ap); vsnprintf(bot->out, sizeof bot->out, fmt, ap);
va_end(ap); va_end(ap);
sprintf(outbuf, "%s\r\n", bot->out);
printf("<< %s\n", outbuf);
#ifdef _WIN32 #ifdef _WIN32
sprintf(outbuf, "%s\r\n", bot->out); sprintf(outbuf, "%s\r\n", bot->out);
send(bot->srv_fd, outbuf, strlen(outbuf), 0); send(bot->srv_fd, outbuf, strlen(outbuf), 0);
@ -187,13 +189,11 @@ void irc_ctcp(struct irc_conn *bot, char *to, char *fmt, ...)
void irc_parse_raw(struct irc_conn *bot, char *raw) void irc_parse_raw(struct irc_conn *bot, char *raw)
{ {
char *user, *host, *par, *text, *chan, *nick, *nicks; char *user, *host, *par, *text, *chan, *nick, *nicks, *tmp;
user = bot->host; user = bot->host;
text = calloc(1, strlen(raw) + 1); text = calloc(1, strlen(raw) + 1);
printf("raw: %s", raw);
if (!raw || !*raw) if (!raw || !*raw)
{ {
return; return;
@ -218,7 +218,7 @@ void irc_parse_raw(struct irc_conn *bot, char *raw)
trim(par); trim(par);
printf("dbug raw: %s\n", raw); printf("dbug raw: %s\r\n", raw);
if (!strcmp("PONG", raw)) if (!strcmp("PONG", raw))
{ {
@ -319,18 +319,12 @@ void irc_parse_raw(struct irc_conn *bot, char *raw)
#endif #endif
irc_raw(bot, "NICK %s", bot->nick); irc_raw(bot, "NICK %s", bot->nick);
} }
else if (strstr("353", raw) != NULL) else if (!strcmp("353", raw))
{ {
printf("debug raw: %s\n", raw);
printf("debug par: %s, text: %s\n", par, text);
// par: BotName = #channel
// extract channel name
chan = skip(par, ' '); chan = skip(par, ' ');
chan = skip(chan, '='); chan = skip(chan, '=');
chan = skip(chan, ' '); chan = skip(chan, ' ');
// text is a list of nicks separated by spaces
#ifdef _WIN32 #ifdef _WIN32
nicks = _strdup(text); nicks = _strdup(text);
#else #else
@ -338,17 +332,41 @@ void irc_parse_raw(struct irc_conn *bot, char *raw)
#endif #endif
nick = strtok(nicks, " "); nick = strtok(nicks, " ");
printf("debug: chan: %s, nicks: %s\n", chan, nicks);
while (nick) while (nick)
{ {
add_user_to_channel(nick, "", chan); add_user_to_channel(nick, "", chan);
tmp = nick;
if (nick[0] == '@' || nick[0] == '+' || nick[0] == '%' || nick[0] == '~' || nick[0] == '&')
{
tmp++;
}
irc_raw(bot, "WHO %s", tmp);
nick = strtok(NULL, " "); nick = strtok(NULL, " ");
} }
fire_handler(bot, IRC_NAMREPLY, chan, text); fire_handler(bot, IRC_NAMREPLY, chan, text);
} }
else if (!strcmp(raw, "352"))
{
char *chan, *user, *host, *server, *nick, *flags, *realname;
chan = skip(par, ' ');
user = skip(chan, ' ');
host = skip(user, ' ');
server = skip(host, ' ');
nick = skip(server, ' ');
flags = skip(nick, ' ');
realname = skip(text, ' ');
update_user(nick, user);
update_host(nick, host);
update_server(nick, server);
update_realname(nick, realname);
fire_handler(bot, IRC_WHOREPLY, chan, user, host, server, nick, flags, realname);
}
else else
{ {
if (!strcmp("NICK", raw) && !strcmp(user, bot->nick)) if (!strcmp("NICK", raw) && !strcmp(user, bot->nick))