zynk/cmd_weather.h

46 lines
1.5 KiB
C
Raw Normal View History

#ifndef CMD_WEATHER_H
#define CMD_WEATHER_H
#include "zynk.h"
/*
* cmd_weather - Handle the "!weather [city]" command.
*
* Fetches current weather data from wttr.in for the specified city
* (defaults to Berlin). Normalizes the city name, fetches the one-line
* weather format, and sends the result to IRC. Rate-limited.
*
* Parameters:
* s - The IRC session.
* msg - The raw message text.
* reply_target - Channel or nick to reply to.
* src_nick - The nick of the user who sent the command.
*
* Returns: 1 if matched, 0 otherwise.
*/
int cmd_weather(Session *s, const char *msg, const char *reply_target, const char *src_nick) {
if (strncmp(msg, "!weather", 8) != 0) return 0;
if (msg[8] != ' ' && msg[8] != '\0') return 0;
2026-07-25 20:37:07 +02:00
if (rate_limit_check(src_nick, reply_target, current_userhost) < 0) return 1;
char city[256], city_url[256];
const char *rest = msg[8] == ' ' ? msg + 9 : "";
while (*rest == ' ') rest++;
normalize_city(rest, city, sizeof city, city_url, sizeof city_url);
char url[512];
snprintf(url, sizeof url, "https://wttr.in/%s?format=%%l:+%%t+%%C&m", city_url);
char *body = fetch_url(url);
char resp[1024];
if (body) {
char *nl = strchr(body, '\n');
if (nl) *nl = 0;
snprintf(resp, sizeof resp, "%s", body);
free(body);
} else {
snprintf(resp, sizeof resp, "Weather: could not fetch data");
}
irc_reply(s, reply_target, src_nick, resp);
log_stamp(); fprintf(stderr, CLR_MAGENTA "WEATHER %s from %s:" CLR_RESET " %s\n", reply_target, src_nick, resp);
return 1;
}
#endif