about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--catgirl.19
-rw-r--r--chat.c7
-rw-r--r--chat.h3
-rw-r--r--irc.c14
4 files changed, 30 insertions, 3 deletions
diff --git a/catgirl.1 b/catgirl.1
index 158466b..e9bb40e 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -8,7 +8,7 @@
 .
 .Sh SYNOPSIS
 .Nm
-.Op Fl e
+.Op Fl ev
 .Op Fl a Ar auth
 .Op Fl c Ar cert
 .Op Fl h Ar host
@@ -88,6 +88,13 @@ Set username to
 .Ar user .
 The default username is the same as the nickname.
 .
+.It Fl v
+Log raw IRC messages to the
+.Sy <debug>
+window
+as well as standard error
+if it is not a terminal.
+.
 .It Fl w Ar pass
 Log in with the server password
 .Ar pass .
diff --git a/chat.c b/chat.c
index 89579c0..5796085 100644
--- a/chat.c
+++ b/chat.c
@@ -39,7 +39,7 @@ int main(int argc, char *argv[]) {
 	const char *real = NULL;
 
 	int opt;
-	while (0 < (opt = getopt(argc, argv, "!a:c:eh:j:k:n:p:r:u:w:"))) {
+	while (0 < (opt = getopt(argc, argv, "!a:c:eh:j:k:n:p:r:u:vw:"))) {
 		switch (opt) {
 			break; case '!': insecure = true;
 			break; case 'a': sasl = true; self.plain = optarg;
@@ -52,6 +52,7 @@ int main(int argc, char *argv[]) {
 			break; case 'p': port = optarg;
 			break; case 'r': real = optarg;
 			break; case 'u': user = optarg;
+			break; case 'v': self.debug = true;
 			break; case 'w': pass = optarg;
 		}
 	}
@@ -70,4 +71,8 @@ int main(int argc, char *argv[]) {
 	ircFormat("CAP LS\r\n");
 	ircFormat("NICK :%s\r\n", nick);
 	ircFormat("USER %s 0 * :%s\r\n", user, real);
+
+	for (;;) {
+		ircRecv();
+	}
 }
diff --git a/chat.h b/chat.h
index bb8929b..4dd4732 100644
--- a/chat.h
+++ b/chat.h
@@ -33,10 +33,11 @@ enum Cap {
 };
 
 extern struct Self {
+	bool debug;
+	const char *join;
 	enum Cap caps;
 	char *plain;
 	char *nick;
-	const char *join;
 } self;
 
 #define ENUM_TAG \
diff --git a/irc.c b/irc.c
index c1c0e7a..cf8aab7 100644
--- a/irc.c
+++ b/irc.c
@@ -101,6 +101,18 @@ int ircConnect(const char *host, const char *port) {
 	return sock;
 }
 
+static void debug(char dir, const char *line) {
+	if (!self.debug) return;
+	size_t len = strcspn(line, "\r\n");
+	/*uiFormat(
+		Debug, Cold, NULL, "\3%02d%c%c\3 %.*s",
+		Gray, dir, dir, (int)len, line
+	);*/
+	if (!isatty(STDERR_FILENO)) {
+		fprintf(stderr, "%c%c %.*s\n", dir, dir, (int)len, line);
+	}
+}
+
 void ircSend(const char *ptr, size_t len) {
 	assert(client);
 	while (len) {
@@ -119,6 +131,7 @@ void ircFormat(const char *format, ...) {
 	int len = vsnprintf(buf, sizeof(buf), format, ap);
 	va_end(ap);
 	assert((size_t)len < sizeof(buf));
+	debug('<', buf);
 	ircSend(buf, len);
 }
 
@@ -196,6 +209,7 @@ void ircRecv(void) {
 		crlf = memmem(line, &buf[len] - line, "\r\n", 2);
 		if (!crlf) break;
 		*crlf = '\0';
+		debug('>', line);
 		handle(parse(line));
 		line = crlf + 2;
 	}