summaryrefslogtreecommitdiff
path: root/src/send.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/send.cpp')
-rw-r--r--src/send.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/send.cpp b/src/send.cpp
new file mode 100644
index 000000000..4209e2a1b
--- /dev/null
+++ b/src/send.cpp
@@ -0,0 +1,232 @@
+/* Routines for sending stuff to the network.
+ *
+ * (C) 2003-2010 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/**
+ * Send a command to the server. The two forms here are like
+ * printf()/vprintf() and friends.
+ * @param source Orgin of the Message (some times NULL)
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void send_cmd(const char *source, const char *fmt, ...)
+{
+ va_list args;
+ static char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+
+ if (!UplinkSock)
+ {
+ if (source)
+ Alog(LOG_DEBUG) << "Attemtped to send \"" << source << " " << buf << "\" with UplinkSock NULL";
+ else
+ Alog(LOG_DEBUG) << "Attemtped to send \"" << buf << "\" with UplinkSock NULL";
+ return;
+ }
+
+ if (source)
+ {
+ UplinkSock->Write(":%s %s", source, buf);
+ Alog(LOG_DEBUG) << "Sent: :" << source << " " << buf;
+ }
+ else
+ {
+ UplinkSock->Write("%s", buf);
+ Alog(LOG_DEBUG) << "Sent: "<< buf;
+ }
+
+ va_end(args);
+}
+
+
+/*
+ * Copypasta version that accepts std::string source.
+ */
+void send_cmd(const std::string &source, const char *fmt, ...)
+{
+ va_list args;
+ static char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+
+ if (!UplinkSock)
+ {
+ if (!source.empty())
+ Alog(LOG_DEBUG) << "Attemtped to send \"" << source << " " << buf << "\" with UplinkSock NULL";
+ else
+ Alog(LOG_DEBUG) << "Attemtped to send " << buf << "\" with UplinkSock NULL";
+ return;
+ }
+
+ if (!source.empty())
+ {
+ UplinkSock->Write(":%s %s", source.c_str(), buf);
+ Alog(LOG_DEBUG) << "Sent: :" << source << " " << buf;
+ }
+ else
+ {
+ UplinkSock->Write("%s", buf);
+ Alog(LOG_DEBUG) << "Sent: " << buf;
+ }
+
+ va_end(args);
+}
+
+/*************************************************************************/
+
+/**
+ * Send a server notice
+ * @param source Orgin of the Message
+ * @param s Server Struct
+ * @param fmt Format of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice_server(char *source, Server * s, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+ *buf = '\0';
+
+ if (fmt) {
+ va_start(args, fmt);
+ vsnprintf(buf, BUFSIZE - 1, fmt, args);
+
+ if (Config.NSDefFlags.HasFlag(NI_MSG)) {
+ ircdproto->SendGlobalPrivmsg(findbot(source), s, buf);
+ } else {
+ ircdproto->SendGlobalNotice(findbot(source), s, buf);
+ }
+ va_end(args);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Send a NULL-terminated array of text as NOTICEs.
+ * @param source Orgin of the Message
+ * @param dest Destination of the Notice
+ * @param text Array of text to send
+ * @return void
+ */
+void notice_list(char *source, char *dest, char **text)
+{
+ User *u = finduser(dest);
+ while (*text) {
+ /* Have to kludge around an ircII bug here: if a notice includes
+ * no text, it is ignored, so we replace blank lines by lines
+ * with a single space.
+ */
+ if (**text) {
+ u->SendMessage(source, "%s", *text);
+ } else {
+ u->SendMessage(source, " ");
+ }
+ text++;
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Send a message in the user's selected language to the user using NOTICE.
+ * @param source Orgin of the Message
+ * @param u User Struct
+ * @param int Index of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice_lang(const std::string &source, User * dest, int message, ...)
+{
+ va_list args;
+ char buf[4096]; /* because messages can be really big */
+ char *s, *t;
+ const char *fmt;
+
+ if (!dest || !message) {
+ return;
+ }
+ va_start(args, message);
+ fmt = getstring(dest, message);
+
+ if (!fmt)
+ return;
+ memset(buf, 0, 4096);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ s = buf;
+ while (*s) {
+ t = s;
+ s += strcspn(s, "\n");
+ if (*s)
+ *s++ = 0;
+
+ dest->SendMessage(source, "%s", *t ? t : " ");
+ }
+ va_end(args);
+}
+
+/*************************************************************************/
+
+/**
+ * Like notice_lang(), but replace %S by the source. This is an ugly hack
+ * to simplify letting help messages display the name of the pseudoclient
+ * that's sending them.
+ * @param source Orgin of the Message
+ * @param u User Struct
+ * @param int Index of the Message
+ * @param ... any number of parameters
+ * @return void
+ */
+void notice_help(const char *source, User * dest, int message, ...)
+{
+ va_list args;
+ char buf[4096], buf2[4096], outbuf[BUFSIZE];
+ char *s, *t;
+ const char *fmt;
+
+ if (!dest || !message) {
+ return;
+ }
+ va_start(args, message);
+ fmt = getstring(dest, message);
+ if (!fmt)
+ return;
+ /* Some sprintf()'s eat %S or turn it into just S, so change all %S's
+ * into \1\1... we assume this doesn't occur anywhere else in the
+ * string. */
+ strscpy(buf2, fmt, sizeof(buf2));
+ strnrepl(buf2, sizeof(buf2), "%S", "\1\1");
+ vsnprintf(buf, sizeof(buf), buf2, args);
+ s = buf;
+ while (*s) {
+ t = s;
+ s += strcspn(s, "\n");
+ if (*s)
+ *s++ = 0;
+ strscpy(outbuf, t, sizeof(outbuf));
+ strnrepl(outbuf, sizeof(outbuf), "\1\1", source);
+
+ dest->SendMessage(source, "%s", *outbuf ? outbuf : " ");
+ }
+ va_end(args);
+}