summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--database.h6
-rw-r--r--litterbox.c26
2 files changed, 32 insertions, 0 deletions
diff --git a/database.h b/database.h
index 8d8c985..3d88757 100644
--- a/database.h
+++ b/database.h
@@ -218,6 +218,12 @@ static const char *InitSQL = SQL(
 		UNIQUE (network, name)
 	);
 
+	CREATE TABLE topics (
+		context INTEGER NOT NULL REFERENCES contexts,
+		time DATETIME NOT NULL,
+		topic TEXT
+	);
+
 	CREATE TABLE names (
 		name INTEGER PRIMARY KEY,
 		nick TEXT NOT NULL,
diff --git a/litterbox.c b/litterbox.c
index 181227a..964a6ea 100644
--- a/litterbox.c
+++ b/litterbox.c
@@ -29,6 +29,7 @@
 
 static struct {
 	sqlite3_stmt *context;
+	sqlite3_stmt *topic;
 	sqlite3_stmt *event;
 	sqlite3_stmt *events;
 } insert;
@@ -49,6 +50,13 @@ static void prepare(void) {
 	);
 	dbPersist(&insert.context, InsertContext);
 
+	const char *InsertTopic = SQL(
+		INSERT INTO topics (context, time, topic)
+		SELECT context, coalesce(datetime(:time), datetime('now')), :topic
+		FROM contexts WHERE network = :network AND name = :context;
+	);
+	dbPersist(&insert.topic, InsertTopic);
+
 	const char *InsertEvent = SQL(
 		INSERT INTO events (time, type, context, name, target, message)
 		SELECT
@@ -81,6 +89,7 @@ static void prepare(void) {
 
 static void bindNetwork(const char *network) {
 	dbBindTextCopy(insert.context, ":network", network);
+	dbBindTextCopy(insert.topic, ":network", network);
 	dbBindTextCopy(insert.event, ":network", network);
 	dbBindTextCopy(insert.events, ":network", network);
 }
@@ -91,6 +100,15 @@ static void insertContext(const char *context, bool query) {
 	dbRun(insert.context);
 }
 
+static void insertTopic(
+	const char *context, const char *time, const char *topic
+) {
+	dbBindText(insert.topic, ":context", context);
+	dbBindText(insert.topic, ":time", time);
+	dbBindText(insert.topic, ":topic", topic);
+	dbRun(insert.topic);
+}
+
 static void insertEvent(
 	const char *time, enum Type type, const char *context,
 	const char *nick, const char *user, const char *host,
@@ -316,6 +334,12 @@ static void handlePrivmsg(struct Message *msg) {
 	);
 }
 
+static void handleReplyTopic(struct Message *msg) {
+	require(msg, false, 2);
+	if (!strcmp(msg->cmd, "331")) msg->params[2] = NULL;
+	insertTopic(msg->params[1], msg->time, msg->params[2]);
+}
+
 static void handleReplyNames(struct Message *msg) {
 	require(msg, false, 3);
 	char *names = msg->params[3];
@@ -411,6 +435,8 @@ static const struct {
 } Handlers[] = {
 	{ "001", false, handleReplyWelcome },
 	{ "005", false, handleReplyISupport },
+	{ "331", true, handleReplyTopic },
+	{ "332", true, handleReplyTopic },
 	{ "353", true, handleReplyNames },
 	{ "CAP", false, handleCap },
 	{ "JOIN", true, handleJoin },