Update xmpp_bot.c

This commit is contained in:
polymath 2024-10-06 19:13:48 +02:00
parent b4230bce78
commit 9a29af1f18

View file

@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#define SERVER "whatevermaybe.net" #define SERVER "whatevermaybe.net"
#define ROOM_JID "archlinux@chat.hax.al" #define ROOM_JID "archlinux@chat.hax.al"
@ -28,8 +29,29 @@ char welcome_message[512];
/* Function prototypes */ /* Function prototypes */
void send_whisper(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char *to_jid, const char *message); void send_whisper(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char *to_jid, const char *message);
void send_room_message(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char *message);
int message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata); int message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata);
/* Logging function with timestamp */
void log_with_timestamp(const char *format, ...) {
time_t now;
struct tm *tm_info;
char timestamp[26];
va_list args;
time(&now);
tm_info = localtime(&now);
strftime(timestamp, 26, "%Y-%m-%d %H:%M:%S", tm_info);
fprintf(stderr, "[%s] ", timestamp);
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fprintf(stderr, "\n");
}
/* User list functions */ /* User list functions */
void userlist_add(UserList *list, const char *jid) { void userlist_add(UserList *list, const char *jid) {
if (list->count >= list->size) { if (list->count >= list->size) {
@ -63,6 +85,31 @@ void send_welcome_message(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char
send_whisper(conn, ctx, to_jid, formatted_msg); send_whisper(conn, ctx, to_jid, formatted_msg);
} }
/* Send a message to the room */
void send_room_message(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char *message) {
xmpp_stanza_t *msg = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(msg, "message");
xmpp_stanza_set_type(msg, "groupchat");
xmpp_stanza_set_attribute(msg, "to", ROOM_JID);
xmpp_stanza_t *body = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(body, "body");
xmpp_stanza_t *text = xmpp_stanza_new(ctx);
xmpp_stanza_set_text(text, message);
xmpp_stanza_add_child(body, text);
xmpp_stanza_add_child(msg, body);
xmpp_stanza_release(text);
xmpp_stanza_release(body);
xmpp_send(conn, msg);
xmpp_stanza_release(msg);
log_with_timestamp("Sent room message: %s", message);
}
/* Send a whisper message */ /* Send a whisper message */
void send_whisper(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char *to_jid, const char *message) { void send_whisper(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char *to_jid, const char *message) {
xmpp_stanza_t *msg = xmpp_stanza_new(ctx); xmpp_stanza_t *msg = xmpp_stanza_new(ctx);
@ -82,12 +129,12 @@ void send_whisper(xmpp_conn_t * const conn, xmpp_ctx_t *ctx, const char *to_jid,
xmpp_send(conn, msg); xmpp_send(conn, msg);
xmpp_stanza_release(msg); xmpp_stanza_release(msg);
fprintf(stderr, "Sent whisper to %s: %s\n", to_jid, message); log_with_timestamp("Sent whisper to %s: %s", to_jid, message);
} }
/* Check if user is admin or owner */ /* Check if user is admin or owner */
int is_admin_or_owner(const char *affiliation) { int is_admin_or_owner(const char *affiliation) {
return (strcmp(affiliation, "owner") == 0 || strcmp(affiliation, "admin") == 0); return (strcmp(affiliation, "Owners") == 0 || strcmp(affiliation, "Administrators") == 0);
} }
/* Handle presence stanzas */ /* Handle presence stanzas */
@ -128,13 +175,24 @@ int message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void
if (item) { if (item) {
const char *affiliation = xmpp_stanza_get_attribute(item, "affiliation"); const char *affiliation = xmpp_stanza_get_attribute(item, "affiliation");
if (is_admin_or_owner(affiliation)) { if (is_admin_or_owner(affiliation)) {
const char *nickname = get_nickname(from);
char *new_msg = message + strlen(CMD_PREFIX) + 1; char *new_msg = message + strlen(CMD_PREFIX) + 1;
char old_msg[512];
strncpy(old_msg, welcome_message, sizeof(old_msg) - 1);
strncpy(welcome_message, new_msg, sizeof(welcome_message) - 1); strncpy(welcome_message, new_msg, sizeof(welcome_message) - 1);
welcome_message[sizeof(welcome_message) - 1] = '\0'; welcome_message[sizeof(welcome_message) - 1] = '\0';
char response[1024]; /* Announce the change to the room */
snprintf(response, sizeof(response), "Welcome message updated to: %s", welcome_message); char announcement[1024];
send_whisper(conn, ctx, from, response); snprintf(announcement, sizeof(announcement),
"Welcome message changed by %s\nOld: %s\nNew: %s",
nickname, old_msg, welcome_message);
send_room_message(conn, ctx, announcement);
/* Log the change */
log_with_timestamp("Welcome message changed by %s from '%s' to '%s'",
nickname, old_msg, welcome_message);
} }
} }
} }
@ -152,7 +210,7 @@ void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status,
xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata; xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
if (status == XMPP_CONN_CONNECT) { if (status == XMPP_CONN_CONNECT) {
fprintf(stderr, "Connected to server %s\n", SERVER); log_with_timestamp("Connected to server %s", SERVER);
xmpp_handler_add(conn, presence_handler, NULL, "presence", NULL, ctx); xmpp_handler_add(conn, presence_handler, NULL, "presence", NULL, ctx);
xmpp_handler_add(conn, message_handler, NULL, "message", NULL, ctx); xmpp_handler_add(conn, message_handler, NULL, "message", NULL, ctx);
@ -173,17 +231,17 @@ void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status,
xmpp_send(conn, presence); xmpp_send(conn, presence);
xmpp_stanza_release(presence); xmpp_stanza_release(presence);
fprintf(stderr, "Sent presence to join room: %s\n", to_buffer); log_with_timestamp("Sent presence to join room: %s", to_buffer);
bot_joined = 1; bot_joined = 1;
} else { } else {
if (error) { if (error) {
fprintf(stderr, "Connection error: %d\n", error); log_with_timestamp("Connection error: %d", error);
if (stream_error) { if (stream_error) {
fprintf(stderr, "Stream error type: %d\n", stream_error->type); log_with_timestamp("Stream error type: %d", stream_error->type);
} }
} }
fprintf(stderr, "Disconnected from server\n"); log_with_timestamp("Disconnected from server");
xmpp_stop(ctx); xmpp_stop(ctx);
} }
} }
@ -211,13 +269,13 @@ int main(void) {
xmpp_conn_set_pass(conn, BOT_PASSWORD); xmpp_conn_set_pass(conn, BOT_PASSWORD);
xmpp_conn_set_flags(conn, XMPP_CONN_FLAG_MANDATORY_TLS); xmpp_conn_set_flags(conn, XMPP_CONN_FLAG_MANDATORY_TLS);
fprintf(stderr, "Connecting to %s...\n", SERVER); log_with_timestamp("Connecting to %s...", SERVER);
if (xmpp_connect_client(conn, SERVER, 0, conn_handler, ctx) == XMPP_EOK) { if (xmpp_connect_client(conn, SERVER, 0, conn_handler, ctx) == XMPP_EOK) {
fprintf(stderr, "Running connection...\n"); log_with_timestamp("Running connection...");
xmpp_run(ctx); xmpp_run(ctx);
} else { } else {
fprintf(stderr, "Failed to start connection\n"); log_with_timestamp("Failed to start connection");
} }
xmpp_conn_release(conn); xmpp_conn_release(conn);