summaryrefslogtreecommitdiff
path: root/send.c
diff options
context:
space:
mode:
Diffstat (limited to 'send.c')
-rw-r--r--send.c202
1 files changed, 202 insertions, 0 deletions
diff --git a/send.c b/send.c
new file mode 100644
index 000000000..778b8662d
--- /dev/null
+++ b/send.c
@@ -0,0 +1,202 @@
+/* Routines for sending stuff to the network.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: send.c,v 1.11 2004/01/18 05:10:47 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/* Send a command to the server. The two forms here are like
+ * printf()/vprintf() and friends. */
+
+void send_cmd(const char *source, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vsend_cmd(source, fmt, args);
+ va_end(args);
+}
+
+void vsend_cmd(const char *source, const char *fmt, va_list args)
+{
+ char buf[BUFSIZE];
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ if (source) {
+ sockprintf(servsock, ":%s %s\r\n", source, buf);
+ if (debug)
+ alog("debug: Sent: :%s %s", source, buf);
+ } else {
+ sockprintf(servsock, "%s\r\n", buf);
+ if (debug)
+ alog("debug: Sent: %s", buf);
+ }
+}
+
+/*************************************************************************/
+
+/* Send out a WALLOPS (a GLOBOPS on ircd.dal). */
+
+void wallops(const char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+#ifdef IRC_HYBRID
+ send_cmd(source ? source : ServerName, "WALLOPS :%s", buf);
+#else
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+#endif
+}
+
+/*************************************************************************/
+
+/* Send a NOTICE from the given source to the given nick. */
+void notice(const char *source, const char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ send_cmd(source, "%s %s :%s", (UsePrivmsg ? "PRIVMSG" : "NOTICE"),
+ dest, buf);
+}
+
+/*************************************************************************/
+
+void notice_user(const char *source, User * u, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ send_cmd(source, "%s %s :%s",
+ (UsePrivmsg && (!u->na || (u->na->nc->flags & NI_MSG)) ?
+ "PRIVMSG" : "NOTICE"), u->nick, buf);
+}
+
+/*************************************************************************/
+
+/* Send a NULL-terminated array of text as NOTICEs. */
+void notice_list(const char *source, const char *dest, const char **text)
+{
+ 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)
+ notice(source, dest, *text);
+ else
+ notice(source, dest, " ");
+ text++;
+ }
+}
+
+/*************************************************************************/
+
+/* Send a message in the user's selected language to the user using NOTICE. */
+void notice_lang(const char *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)
+ return;
+ va_start(args, message);
+ fmt = getstring(dest->na, 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;
+ send_cmd(source, "%s %s :%s", (UsePrivmsg
+ && (!dest->na || (dest->na->nc->
+ flags &
+ NI_MSG)) ?
+ "PRIVMSG" : "NOTICE"),
+ dest->nick, *t ? t : " ");
+ }
+}
+
+/*************************************************************************/
+
+/* 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.
+ */
+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)
+ return;
+ va_start(args, message);
+ fmt = getstring(dest->na, 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);
+ send_cmd(source, "%s %s :%s",
+ (UsePrivmsg
+ && (!dest->na
+ || (dest->na->nc->
+ flags & NI_MSG)) ? "PRIVMSG" : "NOTICE"),
+ dest->nick, *outbuf ? outbuf : " ");
+ }
+}
+
+/*************************************************************************/
+
+/* Send a PRIVMSG from the given source to the given nick. */
+void privmsg(const char *source, const char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+/*************************************************************************/