X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/cd25f2e983991b8769135c8e88a372272ec6d96c..7a27854095fb80ce76e2ef5a59e87f42fbbe45fe:/src/proto-p10.c diff --git a/src/proto-p10.c b/src/proto-p10.c index 37466e8..14d0d29 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -662,6 +662,7 @@ irc_wallops(const char *format, ...) putsock("%s " P10_WALLOPS " :%s", self->numeric, buffer); } + void irc_notice(struct userNode *from, const char *to, const char *message) { @@ -680,6 +681,18 @@ irc_privmsg(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) { @@ -962,6 +975,12 @@ 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) { @@ -1038,7 +1057,7 @@ irc_topic(struct userNode *service, struct userNode *who, struct chanNode *what, 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); @@ -2675,6 +2694,9 @@ AddUser(struct server* uplink, const char *nick, const char *ident, const char * 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; @@ -2749,6 +2771,19 @@ DelUser(struct userNode* user, struct userNode *killer, int announce, const char } 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.