diff --git a/activitypub.c b/activitypub.c index 651c18c..5c98389 100644 --- a/activitypub.c +++ b/activitypub.c @@ -771,13 +771,8 @@ xs_dict *msg_note(snac *snac, xs_str *content, xs_val *rcpts, xs_str *in_reply_t void notify(snac *snac, char *type, char *utype, char *actor, char *msg) /* notifies the user of relevant events */ { - char *email = xs_dict_get(snac->config, "email"); char *object = NULL; - /* no email address? done */ - if (xs_is_null(email) || *email == '\0') - return; - if (strcmp(type, "Create") == 0) { /* only notify of notes specifically for us */ xs *rcpts = recipient_list(snac, msg, 0); @@ -804,21 +799,8 @@ void notify(snac *snac, char *type, char *utype, char *actor, char *msg) } } - snac_debug(snac, 1, xs_fmt("notify(%s, %s, %s)", type, utype, actor)); - - /* prepare message */ - - xs *subject = xs_fmt("snac notify for @%s@%s", - xs_dict_get(snac->config, "uid"), xs_dict_get(srv_config, "host")); - xs *from = xs_fmt("snac-daemon ", xs_dict_get(srv_config, "host")); - xs *header = xs_fmt( - "From: %s\n" - "To: %s\n" - "Subject: %s\n" - "\n", - from, email, subject); - - xs *body = xs_str_new(header); + /* prepare message body */ + xs *body = xs_str_new(NULL); if (strcmp(utype, "(null)") != 0) { xs *s1 = xs_fmt("Type : %s + %s\n", type, utype); @@ -839,7 +821,35 @@ void notify(snac *snac, char *type, char *utype, char *actor, char *msg) body = xs_str_cat(body, s1); } - enqueue_email(body, 0); + /* email */ + + char *email = xs_dict_get(snac->config, "email"); + + if (!xs_is_null(email) && *email != '\0') { + snac_debug(snac, 1, xs_fmt("email notify %s %s %s", type, utype, actor)); + + xs *subject = xs_fmt("snac notify for @%s@%s", + xs_dict_get(snac->config, "uid"), xs_dict_get(srv_config, "host")); + xs *from = xs_fmt("snac-daemon ", xs_dict_get(srv_config, "host")); + xs *header = xs_fmt( + "From: %s\n" + "To: %s\n" + "Subject: %s\n" + "\n", + from, email, subject); + + xs *email_body = xs_fmt("%s%s", header, body); + + enqueue_email(email_body, 0); + } + + /* telegram */ + + char *bot = xs_dict_get(snac->config, "telegram_bot"); + char *chat_id = xs_dict_get(snac->config, "telegram_chat_id"); + + if (!xs_is_null(bot) && !xs_is_null(chat_id) && *bot && *chat_id) + enqueue_telegram(body, bot, chat_id); } @@ -1178,17 +1188,40 @@ void process_queue_item(xs_dict *q_item) retries++; if (retries > queue_retry_max) - srv_log(xs_fmt("process_queue email giving up (errno: %d)", errno)); + srv_log(xs_fmt("email giving up (errno: %d)", errno)); else { /* requeue */ srv_log(xs_fmt( - "process_queue email requeue #%d (errno: %d)", retries, errno)); + "email requeue #%d (errno: %d)", retries, errno)); enqueue_email(msg, retries); } } } else + if (strcmp(type, "telegram") == 0) { + /* send this via telegram */ + char *bot = xs_dict_get(q_item, "bot"); + char *msg = xs_dict_get(q_item, "message"); + xs *chat_id = xs_dup(xs_dict_get(q_item, "chat_id")); + int status = 0; + + /* chat_id must start with a - */ + if (!xs_startswith(chat_id, "-")) + chat_id = xs_str_wrap_i("-", chat_id, NULL); + + xs *url = xs_fmt("https:/" "/api.telegram.org/bot%s/sendMessage", bot); + xs *body = xs_fmt("{\"chat_id\":%s,\"text\":\"%s\"}", chat_id, msg); + + xs *headers = xs_dict_new(); + headers = xs_dict_append(headers, "content-type", "application/json"); + + xs *rsp = xs_http_request("POST", url, headers, + body, strlen(body), &status, NULL, NULL, 0); + + srv_debug(0, xs_fmt("telegram post %d", status)); + } + else if (strcmp(type, "purge") == 0) { srv_log(xs_dup("purge start")); @@ -1210,12 +1243,8 @@ void process_queue(void) while (xs_list_iter(&p, &fn)) { xs *q_item = dequeue(fn); - if (q_item == NULL) { - srv_log(xs_fmt("process_queue q_item error")); - continue; - } - - job_post(q_item); + if (q_item != NULL) + job_post(q_item); } } diff --git a/data.c b/data.c index fd5d02c..ad5304a 100644 --- a/data.c +++ b/data.c @@ -1420,6 +1420,22 @@ void enqueue_email(xs_str *msg, int retries) } +void enqueue_telegram(const xs_str *msg, const char *bot, const char *chat_id) +/* enqueues a message to be sent via Telegram */ +{ + xs *qmsg = _new_qmsg("telegram", msg, 0); + char *ntid = xs_dict_get(qmsg, "ntid"); + xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); + + qmsg = xs_dict_append(qmsg, "bot", bot); + qmsg = xs_dict_append(qmsg, "chat_id", chat_id); + + qmsg = _enqueue_put(fn, qmsg); + + srv_debug(1, xs_fmt("enqueue_email %s %s", bot, chat_id)); +} + + void enqueue_message(snac *snac, xs_dict *msg) /* enqueues an output message */ { diff --git a/snac.h b/snac.h index 642606d..da964ab 100644 --- a/snac.h +++ b/snac.h @@ -128,6 +128,7 @@ void enqueue_input(snac *snac, xs_dict *msg, xs_dict *req, int retries); void enqueue_output(snac *snac, xs_dict *msg, xs_str *inbox, int retries); void enqueue_output_by_actor(snac *snac, xs_dict *msg, xs_str *actor, int retries); void enqueue_email(xs_str *msg, int retries); +void enqueue_telegram(const xs_str *msg, const char *bot, const char *chat_id); void enqueue_message(snac *snac, char *msg); xs_list *user_queue(snac *snac);