#define CMD_SQUERY "SQUERY"
#define CMD_SQUIT "SQUIT"
#define CMD_STATS "STATS"
+#define CMD_SVSJOIN "SVSJOIN"
#define CMD_SVSNICK "SVSNICK"
+#define CMD_SVSPART "SVSPART"
#define CMD_SWHOIS "SWHOIS"
#define CMD_TIME "TIME"
#define CMD_TOPIC "TOPIC"
#define TOK_SQUERY "SQUERY"
#define TOK_SQUIT "SQ"
#define TOK_STATS "R"
+#define TOK_SVSJOIN "SJ"
#define TOK_SVSNICK "SN"
+#define TOK_SVSPART "SP"
#define TOK_SWHOIS "SW"
#define TOK_TIME "TI"
#define TOK_TOPIC "T"
#define P10_SQUERY TYPE(SQUERY)
#define P10_SQUIT TYPE(SQUIT)
#define P10_STATS TYPE(STATS)
+#define P10_SVSJOIN TYPE(SVSJOIN)
#define P10_SVSNICK TYPE(SVSNICK)
+#define P10_SVSPART TYPE(SVSPART)
#define P10_SWHOIS TYPE(SWHOIS)
#define P10_TIME TYPE(TIME)
#define P10_TOPIC TYPE(TOPIC)
putsock("%s " P10_WALLOPS " :%s", self->numeric, buffer);
}
+
void
irc_notice(struct userNode *from, const char *to, const char *message)
{
putsock("%s " P10_PRIVMSG " %s :%s", from->numeric, to, message);
}
+void
+irc_privmsg_user(struct userNode *from, struct userNode *to, const char *message)
+{
+ putsock("%s " P10_PRIVMSG " %s :%s", from->numeric, to->numeric, message);
+}
+
+void
+irc_version_user(struct userNode *from, struct userNode *to)
+{
+ irc_privmsg_user(from, to, "\001VERSION\001");
+}
+
void
irc_eob(void)
{
}
}
+void
+irc_svsjoin(struct userNode *from, struct userNode *who, struct chanNode *to)
+{
+ putsock("%s " P10_SVSJOIN " %s %s "FMT_TIME_T, from->uplink->numeric, who->numeric, to->name, now);
+}
+
+void
+irc_svspart(struct userNode *from, struct userNode *who, struct chanNode *to)
+{
+ putsock("%s " P10_SVSPART " %s %s", from->uplink->numeric, who->numeric, to->name);
+}
+
void
irc_kick(struct userNode *who, struct userNode *target, struct chanNode *channel, const char *msg)
{
host_in_topic = atoi(hstr);
}
- if (type == 5) {
+ if (type >= 5) {
putsock("%s " P10_TOPIC " %s %s%s%s%s%s " FMT_TIME_T " " FMT_TIME_T " :%s", service->numeric, what->name,
who->nick, host_in_topic ? "!" : "", host_in_topic ? (IsSetHost(who) ? sident : who->ident) : "",
host_in_topic ? "@" : "", host_in_topic ? shost : "", what->timestamp, now, topic);
return 1;
}
+static CMD_FUNC(cmd_svsjoin)
+{
+ struct create_desc cd;
+
+ if (!(cd.user = GetUserH(argv[1])))
+ return 0;
+ if (argc < 3)
+ return 0;
+ else if (argc < 4)
+ cd.when = now;
+ else
+ cd.when = atoi(argv[3]);
+ parse_foreach(argv[2], join_helper, create_helper, NULL, NULL, &cd);
+ return 1;
+}
+
static CMD_FUNC(cmd_pong)
{
if (argc < 3)
return 1;
}
+static CMD_FUNC(cmd_svspart)
+{
+ struct userNode *user;
+
+ if (argc < 3)
+ return 0;
+ user = GetUserH(argv[1]);
+ if (!user)
+ return 0;
+ parse_foreach(argv[2], part_helper, NULL, NULL, NULL, user);
+ return 1;
+}
+
static CMD_FUNC(cmd_silence)
{
struct userNode *user;
dict_insert(irc_func_dict, TOK_NOTICE, cmd_notice);
dict_insert(irc_func_dict, CMD_STATS, cmd_stats);
dict_insert(irc_func_dict, TOK_STATS, cmd_stats);
+ dict_insert(irc_func_dict, CMD_SVSJOIN, cmd_svsjoin);
+ dict_insert(irc_func_dict, TOK_SVSJOIN, cmd_svsjoin);
dict_insert(irc_func_dict, CMD_SVSNICK, cmd_svsnick);
dict_insert(irc_func_dict, TOK_SVSNICK, cmd_svsnick);
+ dict_insert(irc_func_dict, CMD_SVSPART, cmd_svspart);
+ dict_insert(irc_func_dict, TOK_SVSPART, cmd_svspart);
dict_insert(irc_func_dict, CMD_SWHOIS, cmd_dummy);
dict_insert(irc_func_dict, TOK_SWHOIS, cmd_dummy);
dict_insert(irc_func_dict, CMD_WHOIS, cmd_whois);
make_ipv6virthost((char*)irc_ntoa(&uNode->ip), uNode->hostname, uNode->crypthost);
}
+ if (!uNode->crypthost && uNode->cryptip)
+ snprintf(uNode->crypthost, sizeof(uNode->crypthost), "%s", strdup(uNode->cryptip));
+
uNode->timestamp = timestamp;
modeList_init(&uNode->channels);
uNode->uplink = uplink;
}
modeList_clean(&user->channels);
+
+ /* Clean up version data */
+ if(user->version_reply) {
+ free(user->version_reply);
+ user->version_reply = NULL;
+ }
+
+ /* clean up geoip data if any */
+ if(user->country_code) free(user->country_code);
+ if(user->city) free(user->city);
+ if(user->region) free(user->region);
+ if(user->postal_code) free(user->postal_code);
+
/* We don't free them, in case we try to privmsg them or something
* (like when a stupid oper kills themself). We just put them onto
* a list of clients that get freed after processing each line.