diff options
Diffstat (limited to 'general_network.c')
-rw-r--r-- | general_network.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/general_network.c b/general_network.c new file mode 100644 index 0000000..63d3d7d --- /dev/null +++ b/general_network.c @@ -0,0 +1,90 @@ +// Network stuff for HaxServ +// +// Written by: Test_User <hax@andrewyu.org> +// +// This is free and unencumbered software released into the public +// domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. + +#include <string.h> + +#include "network.h" +#include "tls.h" +#include "config.h" + +int PRIVMSG(struct string source, struct string target, struct string message) { + if (!(target.len == 9 && memcmp(target.data, "1HC000001", 9) == 0)) { // if not sending to our one local user + if (source.len != 0) { + SEND(STRING(":")); + SEND(source); + SEND(STRING(" PRIVMSG ")); + } else { + SEND(STRING("PRIVMSG ")); + } + + SEND(target); + SEND(STRING(" :")); + SEND(message); + SEND(STRING("\n")); + } else { + goto privmsg_client; + } + + if (target.data[0] == '#') { + struct channel_info *channel = get_table_index(channel_list, target); + if (channel && has_table_index(channel->user_list, STRING("1HC000001"))) + goto privmsg_client; + } + + return 0; + + privmsg_client: + + if (source.len != 0) { + SENDCLIENT(STRING(":")); + // TODO: Proper lookups of users and such + if (source.len == 9 && memcmp(source.data, "1HC000000", 9) == 0) { + SENDCLIENT(nick); + SENDCLIENT(STRING("!")); + SENDCLIENT(nick); + SENDCLIENT(STRING("@")); + SENDCLIENT(hostmask); + } else if (source.len == 3 && memcmp(source.data, "1HC", 3) == 0) { + SENDCLIENT(STRING(":hax.irc.andrewyu.org ")); + } + SENDCLIENT(STRING(" PRIVMSG ")); + } else { + SENDCLIENT(STRING(":hax.irc.andrewyu.org PRIVMSG ")); + } + + if (target.len == 9 && memcmp(target.data, "1HC000001", 9) == 0) + SENDCLIENT(client_nick); + else + SENDCLIENT(target); + + SENDCLIENT(STRING(" :")); + SENDCLIENT(message); + SENDCLIENT(STRING("\r\n")); + + return 0; +} |