diff options
Diffstat (limited to 'general_network.c')
-rw-r--r-- | general_network.c | 74 |
1 files changed, 67 insertions, 7 deletions
diff --git a/general_network.c b/general_network.c index 55423a1..8493888 100644 --- a/general_network.c +++ b/general_network.c @@ -48,6 +48,10 @@ #include "openssl_network.h" #endif +#ifdef USE_PSUEDOCLIENTS +#include "psuedoclients.h" +#endif + char casemap[UCHAR_MAX+1] = { ['a'] = 'A', ['b'] = 'B', @@ -194,7 +198,7 @@ int init_general_network(void) { return 1; } -int add_user(struct string from, struct string attached_to, struct string uid, struct string nick, struct string fullname, struct string ident, struct string vhost, struct string host, struct string address, size_t user_ts, size_t nick_ts, void *handle, size_t protocol, size_t net) { +int add_user(struct string from, struct string attached_to, struct string uid, struct string nick, struct string fullname, struct string ident, struct string vhost, struct string host, struct string address, size_t user_ts, size_t nick_ts, void *handle, size_t protocol, size_t net, char is_psuedoclient, size_t psuedoclient) { struct server_info *attached = get_table_index(server_list, attached_to); if (!attached) return 1; @@ -214,6 +218,9 @@ int add_user(struct string from, struct string attached_to, struct string uid, s new_info->net = net; new_info->handle = handle; + new_info->is_psuedoclient = is_psuedoclient; + new_info->psuedoclient = psuedoclient; + new_info->server = attached->sid; if (unsigned_to_str(user_ts, &(new_info->user_ts_str)) != 0) @@ -353,6 +360,21 @@ void remove_user(struct string from, struct user_info *user, struct string reaso } int kill_user(struct string from, struct string source, struct user_info *user, struct string reason) { +#ifdef USE_PSUEDOCLIENTS + if (user->is_psuedoclient) { + switch (user->psuedoclient) { +#ifdef USE_HAXSERV_PSUEDOCLIENT + case HAXSERV_PSUEDOCLIENT: + if (!psuedoclients[HAXSERV_PSUEDOCLIENT].allow_kill(from, source, user, reason)) + return 1; + break; +#endif + default: + break; + } + } +#endif + #ifdef USE_SERVER #ifdef USE_HAXIRCD_PROTOCOL protocols[HAXIRCD_PROTOCOL].propagate_kill_user(from, source, user, reason); @@ -518,18 +540,40 @@ void part_channel(struct string from, struct channel_info *channel, struct user_ } int kick_channel(struct string from, struct string source, struct channel_info *channel, struct user_info *user, struct string reason) { +#ifdef USE_PSUEDOCLIENTS + if (user->is_psuedoclient) { + switch (user->psuedoclient) { +#ifdef USE_HAXSERV_PSUEDOCLIENT + case HAXSERV_PSUEDOCLIENT: + if (!psuedoclients[HAXSERV_PSUEDOCLIENT].allow_kick(from, source, channel, user, reason)) + return 1; + break; +#endif + default: + break; + } + } +#endif + return 1; } int privmsg(struct string from, struct string sender, struct string target, struct string msg) { + struct user_info *user; + struct server_info *server; + struct channel_info *channel; do { - struct user_info *user = get_table_index(user_list, target); + user = get_table_index(user_list, target); if (user) break; - struct server_info *server = get_table_index(server_list, target); + server = get_table_index(server_list, target); if (server) break; + channel = get_table_index(channel_list, target); + if (channel) + break; + char found = 0; for (size_t i = 0; i < user_list.len; i++) { user = user_list.array[i].ptr; @@ -542,10 +586,6 @@ int privmsg(struct string from, struct string sender, struct string target, stru if (found) break; - struct channel_info *channel = get_table_index(channel_list, target); - if (channel) - break; - return 1; // Target not valid } while (0); @@ -558,6 +598,26 @@ int privmsg(struct string from, struct string sender, struct string target, stru #endif #endif +#ifdef USE_PSUEDOCLIENTS + if ((user && user->is_psuedoclient && user->psuedoclient == HAXSERV_PSUEDOCLIENT) || (!user && !server)) { + char send; + if (!user && !server) { + send = 0; + for (size_t i = 0; i < channel->user_list.len; i++) { + struct user_info *user = channel->user_list.array[i].ptr; + if (user->is_psuedoclient && user->psuedoclient == HAXSERV_PSUEDOCLIENT) { + send = 1; + break; + } + } + } else { + send = 1; + } + if (send) + psuedoclients[HAXSERV_PSUEDOCLIENT].handle_privmsg(from, sender, target, msg); + } +#endif + return 0; } |