Turned it into a discord bot :)

This commit is contained in:
Christopher Cookman 2024-05-07 23:18:26 -06:00
parent c1af1a7839
commit 62581c8c34
Signed by: ChrisChrome
GPG key ID: A023A26E42C33A42
6 changed files with 3668 additions and 67 deletions

3
.gitignore vendored
View file

@ -128,4 +128,5 @@ dist
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
config.json
config.json
channels.db

View file

@ -1,15 +1,889 @@
{
"iem": {
"channel": "botstalk"
},
"ntfy": {
"enabled": true,
"server": "",
"topic": "",
"priority": 3
},
"discord": {
"enabled": true,
"webhook": ""
"token": "YOUR_TOKEN"
},
"iem": {
"channels": [
{
"jid": "ilnchat@conference.weather.im",
"name": "ilnchat"
},
{
"jid": "zhuchat@conference.weather.im",
"name": "zhuchat"
},
{
"jid": "rerchat@conference.weather.im",
"name": "Record Event Reports (RER)"
},
{
"jid": "ncrfcchat@conference.weather.im",
"name": "ncrfcchat"
},
{
"jid": "zmechat@conference.weather.im",
"name": "zmechat"
},
{
"jid": "ggwchat@conference.weather.im",
"name": "ggwchat"
},
{
"jid": "sewchat@conference.weather.im",
"name": "sewchat"
},
{
"jid": "ohxchat@conference.weather.im",
"name": "ohxchat"
},
{
"jid": "megchat@conference.weather.im",
"name": "megchat"
},
{
"jid": "mobchat@conference.weather.im",
"name": "mobchat"
},
{
"jid": "brochat@conference.weather.im",
"name": "brochat"
},
{
"jid": "mkx_madison_spotters@conference.weather.im",
"name": "MKX madison storm spotters"
},
{
"jid": "ddcchat@conference.weather.im",
"name": "ddcchat"
},
{
"jid": "zanchat@conference.weather.im",
"name": "zanchat"
},
{
"jid": "mflchat@conference.weather.im",
"name": "mflchat"
},
{
"jid": "michiganwxalerts@conference.weather.im",
"name": "michiganwxalerts"
},
{
"jid": "dvnchat@conference.weather.im",
"name": "dvnchat"
},
{
"jid": "gjtchat@conference.weather.im",
"name": "gjtchat"
},
{
"jid": "ztlchat@conference.weather.im",
"name": "ztlchat"
},
{
"jid": "skywarnstatewidechase@conference.weather.im",
"name": "Skywarn Statewide Chase team"
},
{
"jid": "lmkchat@conference.weather.im",
"name": "lmkchat"
},
{
"jid": "wws44fl@conference.weather.im",
"name": "WWS Tampa Bay"
},
{
"jid": "hatchat@conference.weather.im",
"name": "hatchat"
},
{
"jid": "fwdchat@conference.weather.im",
"name": "fwdchat"
},
{
"jid": "boichat@conference.weather.im",
"name": "boichat"
},
{
"jid": "crisfield-chat@conference.weather.im",
"name": "crisfield-chat"
},
{
"jid": "slcchat@conference.weather.im",
"name": "slcchat"
},
{
"jid": "zobchat@conference.weather.im",
"name": "zobchat"
},
{
"jid": "amachat@conference.weather.im",
"name": "Amarillo, TX"
},
{
"jid": "pqrchat@conference.weather.im",
"name": "pqrchat"
},
{
"jid": "gstweather@conference.weather.im",
"name": "GST Weather"
},
{
"jid": "tws_chat@conference.weather.im",
"name": "tws_chat"
},
{
"jid": "franklin_chat@conference.weather.im",
"name": "Franklin VT Chatroom"
},
{
"jid": "zidchat@conference.weather.im",
"name": "zidchat"
},
{
"jid": "cnrfcchat@conference.weather.im",
"name": "cnrfcchat"
},
{
"jid": "nhcchat@conference.weather.im",
"name": "nhcchat"
},
{
"jid": "mke-skywarn@conference.weather.im",
"name": "MKE Skywarn"
},
{
"jid": "tnwxdiscuss@conference.weather.im",
"name": "TN Statewide Weather Discussion"
},
{
"jid": "stochat@conference.weather.im",
"name": "stochat"
},
{
"jid": "jklchat@conference.weather.im",
"name": "jklchat"
},
{
"jid": "grrchat@conference.weather.im",
"name": "grrchat"
},
{
"jid": "hnxchat@conference.weather.im",
"name": "hnxchat"
},
{
"jid": "spcchat@conference.weather.im",
"name": "Storm Prediction Center Chatroom"
},
{
"jid": "lchchat@conference.weather.im",
"name": "lchchat"
},
{
"jid": "khws@conference.weather.im",
"name": "Huffman Weather Service"
},
{
"jid": "kcichat@conference.weather.im",
"name": "kcichat"
},
{
"jid": "zbwchat@conference.weather.im",
"name": "zbwchat"
},
{
"jid": "otxchat@conference.weather.im",
"name": "otxchat"
},
{
"jid": "kodster@conference.weather.im",
"name": "kodster"
},
{
"jid": "vefchat@conference.weather.im",
"name": "vefchat"
},
{
"jid": "pubchat@conference.weather.im",
"name": "pubchat"
},
{
"jid": "wxst@conference.weather.im",
"name": "Nationwide Encoder Relay Program"
},
{
"jid": "psrchat@conference.weather.im",
"name": "psrchat"
},
{
"jid": "sgxchat@conference.weather.im",
"name": "sgxchat"
},
{
"jid": "pbzchat@conference.weather.im",
"name": "pbzchat"
},
{
"jid": "reddit_weatherlab@conference.weather.im",
"name": "reddit_weatherlab"
},
{
"jid": "nalsw@conference.weather.im",
"name": "nalsw"
},
{
"jid": "ekachat@conference.weather.im",
"name": "ekachat"
},
{
"jid": "ilxchat@conference.weather.im",
"name": "ilxchat"
},
{
"jid": "jsjchat@conference.weather.im",
"name": "jsjchat"
},
{
"jid": "barnburnerwi@conference.weather.im",
"name": "Barn Burner WI"
},
{
"jid": "ohiostormspottersteamoss@conference.weather.im",
"name": "Ohio storm Spotters Team oss"
},
{
"jid": "mlbchat@conference.weather.im",
"name": "mlbchat"
},
{
"jid": "arxchat@conference.weather.im",
"name": "arxchat"
},
{
"jid": "ilmchat@conference.weather.im",
"name": "ilmchat"
},
{
"jid": "okxchat@conference.weather.im",
"name": "okxchat"
},
{
"jid": "botstalk@conference.weather.im",
"name": "botstalk"
},
{
"jid": "lknchat@conference.weather.im",
"name": "lknchat"
},
{
"jid": "siawx_chat@conference.weather.im",
"name": "siawx_chat"
},
{
"jid": "rahchat@conference.weather.im",
"name": "rahchat"
},
{
"jid": "afcchat@conference.weather.im",
"name": "afcchat"
},
{
"jid": "lotchat@conference.weather.im",
"name": "lotchat"
},
{
"jid": "n90@conference.weather.im",
"name": "n90"
},
{
"jid": "boxchat@conference.weather.im",
"name": "boxchat"
},
{
"jid": "znychat@conference.weather.im",
"name": "znychat"
},
{
"jid": "akqchat@conference.weather.im",
"name": "akqchat"
},
{
"jid": "nerfcchat@conference.weather.im",
"name": "nerfcchat"
},
{
"jid": "zkcchat@conference.weather.im",
"name": "zkcchat"
},
{
"jid": "bischat@conference.weather.im",
"name": "bischat"
},
{
"jid": "twcchat@conference.weather.im",
"name": "twcchat"
},
{
"jid": "lmrfcchat@conference.weather.im",
"name": "lmrfcchat"
},
{
"jid": "abrchat@conference.weather.im",
"name": "abrchat"
},
{
"jid": "mbrfcchat@conference.weather.im",
"name": "mbrfcchat"
},
{
"jid": "pihchat@conference.weather.im",
"name": "pihchat"
},
{
"jid": "zoachat@conference.weather.im",
"name": "zoachat"
},
{
"jid": "mtrchat@conference.weather.im",
"name": "mtrchat"
},
{
"jid": "sjuchat@conference.weather.im",
"name": "sjuchat"
},
{
"jid": "gidchat@conference.weather.im",
"name": "gidchat"
},
{
"jid": "zmpchat@conference.weather.im",
"name": "zmpchat"
},
{
"jid": "phichat@conference.weather.im",
"name": "phichat"
},
{
"jid": "pitchat@conference.weather.im",
"name": "WWS Pittsburgh"
},
{
"jid": "chschat@conference.weather.im",
"name": "chschat"
},
{
"jid": "ajkchat@conference.weather.im",
"name": "ajkchat"
},
{
"jid": "chachat@conference.weather.im",
"name": "WWS Charlotte"
},
{
"jid": "bmxchat@conference.weather.im",
"name": "bmxchat"
},
{
"jid": "lixchat@conference.weather.im",
"name": "lixchat"
},
{
"jid": "apxchat@conference.weather.im",
"name": "apxchat"
},
{
"jid": "hunchat@conference.weather.im",
"name": "hunchat"
},
{
"jid": "spcmobile2006@conference.weather.im",
"name": "spcmobile2006"
},
{
"jid": "zmachat@conference.weather.im",
"name": "zmachat"
},
{
"jid": "phl@conference.weather.im",
"name": "PHL TRACON"
},
{
"jid": "dtxchat@conference.weather.im",
"name": "dtxchat"
},
{
"jid": "wbkoweatherwatchers@conference.weather.im",
"name": "wbkoweatherwatchers"
},
{
"jid": "gumchat@conference.weather.im",
"name": "gumchat"
},
{
"jid": "gcwxchat@conference.weather.im",
"name": "gcwxchat"
},
{
"jid": "zzmkxchat@conference.weather.im",
"name": "zzmkxchat"
},
{
"jid": "dentcoeas@conference.weather.im",
"name": "dentcoeas"
},
{
"jid": "marfcchat@conference.weather.im",
"name": "marfcchat"
},
{
"jid": "easwtalk@conference.weather.im",
"name": "easwtalk"
},
{
"jid": "crpchat@conference.weather.im",
"name": "crpchat"
},
{
"jid": "gccc-nc-skywarn@conference.weather.im",
"name": "GCCC NC Skywarn"
},
{
"jid": "zjxchat@conference.weather.im",
"name": "zjxchat"
},
{
"jid": "shvchat@conference.weather.im",
"name": "shvchat"
},
{
"jid": "tbwchat@conference.weather.im",
"name": "tbwchat"
},
{
"jid": "cyschat@conference.weather.im",
"name": "cyschat"
},
{
"jid": "hfochat@conference.weather.im",
"name": "hfochat"
},
{
"jid": "dmxchat@conference.weather.im",
"name": "Des Moines, IA"
},
{
"jid": "mseas-weather-discussion@conference.weather.im",
"name": "MSEAS-Weather-Discussion"
},
{
"jid": "zsechat@conference.weather.im",
"name": "zsechat"
},
{
"jid": "revchat@conference.weather.im",
"name": "revchat"
},
{
"jid": "carchat@conference.weather.im",
"name": "carchat"
},
{
"jid": "msochat@conference.weather.im",
"name": "msochat"
},
{
"jid": "abc3340@conference.weather.im",
"name": "abc3340"
},
{
"jid": "keychat@conference.weather.im",
"name": "keychat"
},
{
"jid": "riwchat@conference.weather.im",
"name": "riwchat"
},
{
"jid": "awpwxchat@conference.weather.im",
"name": "awpwxchat"
},
{
"jid": "mhxchat@conference.weather.im",
"name": "mhxchat"
},
{
"jid": "caechat@conference.weather.im",
"name": "caechat"
},
{
"jid": "indchat@conference.weather.im",
"name": "indchat"
},
{
"jid": "dlhchat@conference.weather.im",
"name": "dlhchat"
},
{
"jid": "unrchat@conference.weather.im",
"name": "unrchat"
},
{
"jid": "wilchat@conference.weather.im",
"name": "WWS Columbus/Wilmington"
},
{
"jid": "okc_chatrooms@conference.weather.im",
"name": "okc_chatrooms"
},
{
"jid": "kdtxchat@conference.weather.im",
"name": "kdtxchat"
},
{
"jid": "zabchat@conference.weather.im",
"name": "zabchat"
},
{
"jid": "wnpchat@conference.weather.im",
"name": "wnpchat"
},
{
"jid": "zlcchat@conference.weather.im",
"name": "zlcchat"
},
{
"jid": "ffcchat@conference.weather.im",
"name": "ffcchat"
},
{
"jid": "epzchat@conference.weather.im",
"name": "epzchat"
},
{
"jid": "taechat@conference.weather.im",
"name": "taechat"
},
{
"jid": "fox6chat@conference.weather.im",
"name": "fox6chat"
},
{
"jid": "cbrfcchat@conference.weather.im",
"name": "cbrfcchat"
},
{
"jid": "wisconsin_storm_spotters@conference.weather.im",
"name": "Wisconsin Storm Spotters"
},
{
"jid": "tfxchat@conference.weather.im",
"name": "tfxchat"
},
{
"jid": "abqchat@conference.weather.im",
"name": "abqchat"
},
{
"jid": "nwrfcchat@conference.weather.im",
"name": "nwrfcchat"
},
{
"jid": "rlxchat@conference.weather.im",
"name": "rlxchat"
},
{
"jid": "ounchat@conference.weather.im",
"name": "ounchat"
},
{
"jid": "clechat@conference.weather.im",
"name": "clechat"
},
{
"jid": "loxchat@conference.weather.im",
"name": "loxchat"
},
{
"jid": "fsdchat@conference.weather.im",
"name": "fsdchat"
},
{
"jid": "bgmchat@conference.weather.im",
"name": "bgmchat"
},
{
"jid": "wgrfcchat@conference.weather.im",
"name": "wgrfcchat"
},
{
"jid": "ewxchat@conference.weather.im",
"name": "ewxchat"
},
{
"jid": "uswat@conference.weather.im",
"name": "Uswat United States weather team"
},
{
"jid": "iowawx@conference.weather.im",
"name": "iowawx"
},
{
"jid": "ohrfcchat@conference.weather.im",
"name": "ohrfcchat"
},
{
"jid": "serfcchat@conference.weather.im",
"name": "serfcchat"
},
{
"jid": "stichat@conference.weather.im",
"name": "stichat"
},
{
"jid": "zdvchat@conference.weather.im",
"name": "zdvchat"
},
{
"jid": "eaxchat@conference.weather.im",
"name": "eaxchat"
},
{
"jid": "iwxchat@conference.weather.im",
"name": "iwxchat"
},
{
"jid": "lubchat@conference.weather.im",
"name": "lubchat"
},
{
"jid": "whntweather@conference.weather.im",
"name": "whntweather"
},
{
"jid": "bufchat@conference.weather.im",
"name": "bufchat"
},
{
"jid": "pdtchat@conference.weather.im",
"name": "pdtchat"
},
{
"jid": "knsw@conference.weather.im",
"name": "knsw"
},
{
"jid": "mkxchat@conference.weather.im",
"name": "mkxchat"
},
{
"jid": "test@conference.weather.im",
"name": "test"
},
{
"jid": "abc3340skywatcher@conference.weather.im",
"name": "abc3340skywatcher"
},
{
"jid": "grbchat@conference.weather.im",
"name": "grbchat"
},
{
"jid": "topchat@conference.weather.im",
"name": "topchat"
},
{
"jid": "rnkchat@conference.weather.im",
"name": "rnkchat"
},
{
"jid": "lzkchat@conference.weather.im",
"name": "lzkchat"
},
{
"jid": "ctpchat@conference.weather.im",
"name": "ctpchat"
},
{
"jid": "gldchat@conference.weather.im",
"name": "gldchat"
},
{
"jid": "abrfcchat@conference.weather.im",
"name": "abrfcchat"
},
{
"jid": "byzchat@conference.weather.im",
"name": "byzchat"
},
{
"jid": "mpxchat@conference.weather.im",
"name": "mpxchat"
},
{
"jid": "zdcchat@conference.weather.im",
"name": "zdcchat"
},
{
"jid": "lsxchat@conference.weather.im",
"name": "lsxchat"
},
{
"jid": "pahchat@conference.weather.im",
"name": "pahchat"
},
{
"jid": "bouchat@conference.weather.im",
"name": "Boulder, CO"
},
{
"jid": "tsachat@conference.weather.im",
"name": "tsachat"
},
{
"jid": "bmxspotterchat@conference.weather.im",
"name": "bmxspotterchat"
},
{
"jid": "zfwchat@conference.weather.im",
"name": "zfwchat"
},
{
"jid": "zauchat@conference.weather.im",
"name": "zauchat"
},
{
"jid": "aprfcchat@conference.weather.im",
"name": "aprfcchat"
},
{
"jid": "wwsreport@conference.weather.im",
"name": "WWS Report"
},
{
"jid": "bmxalertchat@conference.weather.im",
"name": "bmxalertchat"
},
{
"jid": "mqtchat@conference.weather.im",
"name": "mqtchat"
},
{
"jid": "mafchat@conference.weather.im",
"name": "mafchat"
},
{
"jid": "mrxchat@conference.weather.im",
"name": "mrxchat"
},
{
"jid": "fgzchat@conference.weather.im",
"name": "fgzchat"
},
{
"jid": "twitter@conference.weather.im",
"name": "twitter"
},
{
"jid": "oaxchat@conference.weather.im",
"name": "oaxchat"
},
{
"jid": "btvchat@conference.weather.im",
"name": "btvchat"
},
{
"jid": "potomac_tracon@conference.weather.im",
"name": "Potomac TRACON"
},
{
"jid": "ictchat@conference.weather.im",
"name": "ictchat"
},
{
"jid": "mfrchat@conference.weather.im",
"name": "mfrchat"
},
{
"jid": "detroiteaschat@conference.weather.im",
"name": "detroiteaschat"
},
{
"jid": "hgxchat@conference.weather.im",
"name": "hgxchat"
},
{
"jid": "afgchat@conference.weather.im",
"name": "afgchat"
},
{
"jid": "sgfchat@conference.weather.im",
"name": "sgfchat"
},
{
"jid": "hawaii@conference.weather.im",
"name": "Hawaii Weather"
},
{
"jid": "cwest@conference.weather.im",
"name": "CWEST"
},
{
"jid": "zlachat@conference.weather.im",
"name": "zlachat"
},
{
"jid": "alychat@conference.weather.im",
"name": "alychat"
},
{
"jid": "sjtchat@conference.weather.im",
"name": "sjtchat"
},
{
"jid": "janchat@conference.weather.im",
"name": "janchat"
},
{
"jid": "gspchat@conference.weather.im",
"name": "gspchat"
},
{
"jid": "lwxchat@conference.weather.im",
"name": "lwxchat"
},
{
"jid": "gyxchat@conference.weather.im",
"name": "gyxchat"
},
{
"jid": "wpcchat@conference.weather.im",
"name": "WPC Chatroom"
},
{
"jid": "sweaseops1@conference.weather.im",
"name": "sweaseops1"
},
{
"jid": "scwx@conference.weather.im",
"name": "South Carolina Weather"
},
{
"jid": "lbfchat@conference.weather.im",
"name": "lbfchat"
},
{
"jid": "jaxchat@conference.weather.im",
"name": "jaxchat"
},
{
"jid": "nwsc@conference.weather.im",
"name": "Nate's Weather Safety Center"
},
{
"jid": "fgfchat@conference.weather.im",
"name": "fgfchat"
}
]
}
}

282
index.js
View file

@ -1,14 +1,36 @@
// Requires
const config = require("./config.json");
const { client, xml } = require("@xmpp/client");
const fetch = require("node-fetch");
const html = require("html-entities")
const Discord = require("discord.js");
var hook;
if (config.discord.enabled) {
hook = new Discord.WebhookClient({ url: config.discord.webhook })
}
const sqlite3 = require("sqlite3").verbose();
// Setup Discord
const discord = new Discord.Client({
intents: [
"Guilds"
]
});
const {
REST,
Routes
} = require('discord.js');
const rest = new REST({
version: '10'
}).setToken(config.discord.token);
// Setup SQlite DB
const db = new sqlite3.Database("channels.db", (err) => {
if (err) {
console.error(err.message);
}
console.log("Connected to the channels database.");
// Create tables if they dont exist
db.run(`CREATE TABLE IF NOT EXISTS channels (channelid TEXT, iemchannel TEXT, custommessage TEXT)`);
});
// Setup stuff
var startup = true;
const channel = config.iem.channel
// Random funcs
const parseProductID = function (product_id) {
const [timestamp, station, wmo, pil] = product_id.split("-");
@ -35,8 +57,7 @@ const convertDate = function (date) {
const xmpp = client({
service: "xmpp://conference.weather.im",
domain: "weather.im",
resource: channel
domain: "weather.im"
});
//debug(xmpp, true);
@ -44,82 +65,80 @@ const xmpp = client({
xmpp.on("error", (err) => {
console.log("ERROR")
console.error(err);
xmpp.start().catch(console.error);
start();
});
xmpp.on("offline", () => {
console.log("offline");
start();
});
// Simple echo bot example
xmpp.on("stanza", (stanza) => {
// Stops spam from getting old messages
if (startup) return;
// Get new messages and log them, ignore old messages
if (stanza.is("message") && stanza.attrs.type === "groupchat") {
// Get channel name
fromChannel = stanza.attrs.from.split("@")[0];
// Ignores
if (!stanza.getChild("x")) return; // No PID, ignore it
if (!stanza.getChild("x").attrs.product_id) return;
// Get body of message
const body = html.decode(stanza.getChildText("body"));
// get product id from "x" tag
const product_id = parseProductID(stanza.getChild("x").attrs.product_id);
// Check timestamp, if not within 2 minutes, ignore it
// Check timestamp, if not within 3 minutes, ignore it
const now = new Date();
const diff = (now - product_id.timestamp) / 1000 / 60;
if (diff > 3) return;
// Handle NTFY
if (config.ntfy.enabled) {
ntfyBody = {
"topic": config.ntfy.topic,
"message": body,
"title": "New Alert",
"priority": config.ntfy.priority,
"tags": [`Station:${product_id.station}`, `WMO:${product_id.wmo}`, `PIL:${product_id.pil}`, `Channel:${channel}`],
}
if (stanza.getChild("x").attrs.twitter_media) {
ntfyBody.attach = stanza.getChild("x").attrs.twitter_media;
}
if (body) {
fetch(config.ntfy.server, {
method: 'POST',
body: JSON.stringify(ntfyBody)
})
let embed = {
title: "New Alert",
description: body,
color: 0x00ff00,
timestamp: product_id.timestamp,
footer: {
text: `Station: ${product_id.station} WMO: ${product_id.wmo} PIL: ${product_id.pil} Channel: ${fromChannel}`
}
}
// Handle Discord
if (config.discord.enabled) {
let embed = {
title: "New Alert",
description: body,
color: 0x00ff00,
timestamp: product_id.timestamp,
footer: {
text: `Station: ${product_id.station} WMO: ${product_id.wmo} PIL: ${product_id.pil} Channel: ${channel}`
}
if (stanza.getChild("x").attrs.twitter_media) {
embed.image = {
url: stanza.getChild("x").attrs.twitter_media
}
if (stanza.getChild("x").attrs.twitter_media) {
embed.image = {
url: stanza.getChild("x").attrs.twitter_media
}
}
// Run through the database, and find all channels that are linked to the iem channel
db.all(`SELECT channelid, custommessage FROM channels WHERE iemchannel = ?`, [fromChannel], (err, rows) => {
if (err) {
console.error(err.message);
}
hook.send({
embeds: [embed]
rows.forEach((row) => {
const channel = discord.channels.cache.get(row.channelid);
if (!channel) return;
channel.send({ content: row.custommessage, embeds: [embed] });
});
}
});
}
});
xmpp.on("online", async (address) => {
// Makes itself available
await xmpp.send(xml("presence", { to: `${channel}@conference.weather.im/${channel}` }));
// Start listening on all channels, (dont ban me funny man)
// for (const channel in config.iem.channels) {
// console.log(`Joining ${channel.name}`)
// await xmpp.send(xml("presence", { to: `${channel.jud}/${channel.name}` }));
// }
// Join all channels
config.iem.channels.forEach((channel => {
console.log(`Joining ${channel.name}`)
xmpp.send(xml("presence", { to: `${channel.jid}/${channel.jid.split("@")[0]}` }));
}))
console.log("online as", address.toString());
setTimeout(() => {
startup = false;
}, 1000)
@ -134,4 +153,161 @@ const start = () => {
}, 5000);
});
}
start();
// END XMPP
// START DISCORD
discord.on('ready', async () => {
console.log(`Logged in as ${discord.user.tag}!`);
// Do slash command stuff
const commands = [
{
"name": "subscribe",
"description": "Subscribe to a weather.im room",
"default_member_permissions": 0,
"options": [
{
"name": "room",
"description": "The room you want to subscribe to",
"type": 3,
"required": true,
"autocomplete": false
},
{
"name": "message",
"description": "Custom message to send when alert is sent",
"type": 3,
"required": false
}
]
},
{
"name": "setmessage",
"description": "Set a custom message for a room",
"default_member_permissions": 0,
"options": [
{
"name": "room",
"description": "The room you want to set a message for",
"type": 3,
"required": true,
"autocomplete": false
},
{
"name": "message",
"description": "Custom message to send when alert is sent",
"type": 3,
"required": true
}
]
},
{
"name": "unsubscribe",
"description": "Unsubscribe from a weather.im room",
"default_member_permissions": 0,
"options": [
{
"name": "room",
"description": "The room you want to unsubscribe from",
"type": 3,
"required": true,
"autocomplete": false
},
]
},
{
"name": "list",
"description": "List all subscribed rooms for this channel",
"default_member_permissions": 0
}
];
await (async () => {
try {
//Global
await rest.put(Routes.applicationCommands(discord.user.id), { body: commands })
} catch (error) {
console.error(error);
}
})();
start();
});
discord.on("interactionCreate", async (interaction) => {
switch(interaction.type) {
case Discord.InteractionType.ApplicationCommand:
switch (interaction.commandName) {
case "subscribe":
room = interaction.options.getString("room");
if (!config.iem.channels.find((channel) => channel.jid.split("@")[0] === room)) {
interaction.reply({ content: "Invalid room", ephemeral: true });
return;
}
message = interaction.options.getString("message") || null;
db.run(`INSERT INTO channels (channelid, iemchannel, custommessage) VALUES (?, ?, ?)`, [interaction.channel.id, room, message], (err) => {
if (err) {
console.error(err.message);
interaction.reply({ content: "Failed to subscribe to room", ephemeral: true });
} else {
interaction.reply({ content: "Subscribed to room", ephemeral: true });
}
});
break;
case "unsubscribe":
// Check that the room is valid
room = interaction.options.getString("room");
if (!config.iem.channels.find((channel) => channel.jid.split("@")[0] === room)) {
interaction.reply({ content: "Invalid room", ephemeral: true });
return;
}
db.run(`DELETE FROM channels WHERE channelid = ? AND iemchannel = ?`, [interaction.channel.id, room], (err) => {
if (err) {
console.error(err.message);
interaction.reply({ content: "Failed to unsubscribe from room", ephemeral: true });
} else {
interaction.reply({ content: "Unsubscribed from room", ephemeral: true });
}
});
break;
case "list":
db.all(`SELECT iemchannel, custommessage FROM channels WHERE channelid = ?`, [interaction.channel.id], (err, rows) => {
if (err) {
console.error(err.message);
interaction.reply({ content: "Failed to list subscribed rooms", ephemeral: true });
} else {
let message = "";
rows.forEach((row) => {
message += `Room: \`${row.iemchannel}\` Custom Message: \`\`${row.custommessage}\`\`\n`;
});
if (message === "") {
message = "No subscribed rooms";
}
interaction.reply({ content: message, ephemeral: true });
}
});
break;
case "setmessage":
room = interaction.options.getString("room");
if (!config.iem.channels.find((channel) => channel.jid.split("@")[0] === room)) {
interaction.reply({ content: "Invalid room", ephemeral: true });
return;
}
message = interaction.options.getString("message");
db.run(`UPDATE channels SET custommessage = ? WHERE channelid = ? AND iemchannel = ?`, [message, interaction.channel.id, room], (err) => {
if (err) {
console.error(err.message);
interaction.reply({ content: "Failed to set message", ephemeral: true });
} else {
interaction.reply({ content: "Set message", ephemeral: true });
}
});
break;
}
break;
}
});
// Login to discord
discord.login(config.discord.token);

2319
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -12,6 +12,8 @@
"@xmpp/client": "^0.13.1",
"@xmpp/debug": "^0.13.0",
"discord.js": "^14.15.2",
"html-entities": "^2.5.2"
"html-entities": "^2.5.2",
"sqlite3": "^5.1.7",
"xml2json": "^0.12.0"
}
}

231
xml2jsontmp.js Normal file
View file

@ -0,0 +1,231 @@
// Leaving this here for future use
const xml2json = require('xml2json');
const xml = `
<root>
<item jid="ilnchat@conference.weather.im" name="ilnchat" />
<item jid="zhuchat@conference.weather.im" name="zhuchat" />
<item jid="rerchat@conference.weather.im" name="Record Event Reports (RER)" />
<item jid="ncrfcchat@conference.weather.im" name="ncrfcchat" />
<item jid="zmechat@conference.weather.im" name="zmechat" />
<item jid="ggwchat@conference.weather.im" name="ggwchat" />
<item jid="sewchat@conference.weather.im" name="sewchat" />
<item jid="ohxchat@conference.weather.im" name="ohxchat" />
<item jid="megchat@conference.weather.im" name="megchat" />
<item jid="mobchat@conference.weather.im" name="mobchat" />
<item jid="brochat@conference.weather.im" name="brochat" />
<item jid="mkx_madison_spotters@conference.weather.im" name="MKX madison storm spotters" />
<item jid="ddcchat@conference.weather.im" name="ddcchat" />
<item jid="zanchat@conference.weather.im" name="zanchat" />
<item jid="mflchat@conference.weather.im" name="mflchat" />
<item jid="michiganwxalerts@conference.weather.im" name="michiganwxalerts" />
<item jid="dvnchat@conference.weather.im" name="dvnchat" />
<item jid="gjtchat@conference.weather.im" name="gjtchat" />
<item jid="ztlchat@conference.weather.im" name="ztlchat" />
<item jid="skywarnstatewidechase@conference.weather.im" name="Skywarn Statewide Chase team" />
<item jid="lmkchat@conference.weather.im" name="lmkchat" />
<item jid="wws44fl@conference.weather.im" name="WWS Tampa Bay" />
<item jid="hatchat@conference.weather.im" name="hatchat" />
<item jid="fwdchat@conference.weather.im" name="fwdchat" />
<item jid="boichat@conference.weather.im" name="boichat" />
<item jid="crisfield-chat@conference.weather.im" name="crisfield-chat" />
<item jid="slcchat@conference.weather.im" name="slcchat" />
<item jid="zobchat@conference.weather.im" name="zobchat" />
<item jid="amachat@conference.weather.im" name="Amarillo, TX" />
<item jid="pqrchat@conference.weather.im" name="pqrchat" />
<item jid="gstweather@conference.weather.im" name="GST Weather" />
<item jid="tws_chat@conference.weather.im" name="tws_chat" />
<item jid="franklin_chat@conference.weather.im" name="Franklin VT Chatroom" />
<item jid="zidchat@conference.weather.im" name="zidchat" />
<item jid="cnrfcchat@conference.weather.im" name="cnrfcchat" />
<item jid="nhcchat@conference.weather.im" name="nhcchat" />
<item jid="mke-skywarn@conference.weather.im" name="MKE Skywarn" />
<item jid="tnwxdiscuss@conference.weather.im" name="TN Statewide Weather Discussion" />
<item jid="stochat@conference.weather.im" name="stochat" />
<item jid="jklchat@conference.weather.im" name="jklchat" />
<item jid="grrchat@conference.weather.im" name="grrchat" />
<item jid="hnxchat@conference.weather.im" name="hnxchat" />
<item jid="spcchat@conference.weather.im" name="Storm Prediction Center Chatroom" />
<item jid="lchchat@conference.weather.im" name="lchchat" />
<item jid="khws@conference.weather.im" name="Huffman Weather Service" />
<item jid="kcichat@conference.weather.im" name="kcichat" />
<item jid="zbwchat@conference.weather.im" name="zbwchat" />
<item jid="otxchat@conference.weather.im" name="otxchat" />
<item jid="kodster@conference.weather.im" name="kodster" />
<item jid="vefchat@conference.weather.im" name="vefchat" />
<item jid="pubchat@conference.weather.im" name="pubchat" />
<item jid="wxst@conference.weather.im" name="Nationwide Encoder Relay Program" />
<item jid="psrchat@conference.weather.im" name="psrchat" />
<item jid="sgxchat@conference.weather.im" name="sgxchat" />
<item jid="pbzchat@conference.weather.im" name="pbzchat" />
<item jid="reddit_weatherlab@conference.weather.im" name="reddit_weatherlab" />
<item jid="nalsw@conference.weather.im" name="nalsw" />
<item jid="ekachat@conference.weather.im" name="ekachat" />
<item jid="ilxchat@conference.weather.im" name="ilxchat" />
<item jid="jsjchat@conference.weather.im" name="jsjchat" />
<item jid="barnburnerwi@conference.weather.im" name="Barn Burner WI" />
<item jid="ohiostormspottersteamoss@conference.weather.im" name="Ohio storm Spotters Team oss" />
<item jid="mlbchat@conference.weather.im" name="mlbchat" />
<item jid="arxchat@conference.weather.im" name="arxchat" />
<item jid="ilmchat@conference.weather.im" name="ilmchat" />
<item jid="okxchat@conference.weather.im" name="okxchat" />
<item jid="botstalk@conference.weather.im" name="botstalk" />
<item jid="lknchat@conference.weather.im" name="lknchat" />
<item jid="siawx_chat@conference.weather.im" name="siawx_chat" />
<item jid="rahchat@conference.weather.im" name="rahchat" />
<item jid="afcchat@conference.weather.im" name="afcchat" />
<item jid="lotchat@conference.weather.im" name="lotchat" />
<item jid="n90@conference.weather.im" name="n90" />
<item jid="boxchat@conference.weather.im" name="boxchat" />
<item jid="znychat@conference.weather.im" name="znychat" />
<item jid="akqchat@conference.weather.im" name="akqchat" />
<item jid="nerfcchat@conference.weather.im" name="nerfcchat" />
<item jid="zkcchat@conference.weather.im" name="zkcchat" />
<item jid="bischat@conference.weather.im" name="bischat" />
<item jid="twcchat@conference.weather.im" name="twcchat" />
<item jid="lmrfcchat@conference.weather.im" name="lmrfcchat" />
<item jid="abrchat@conference.weather.im" name="abrchat" />
<item jid="mbrfcchat@conference.weather.im" name="mbrfcchat" />
<item jid="pihchat@conference.weather.im" name="pihchat" />
<item jid="zoachat@conference.weather.im" name="zoachat" />
<item jid="mtrchat@conference.weather.im" name="mtrchat" />
<item jid="sjuchat@conference.weather.im" name="sjuchat" />
<item jid="gidchat@conference.weather.im" name="gidchat" />
<item jid="zmpchat@conference.weather.im" name="zmpchat" />
<item jid="phichat@conference.weather.im" name="phichat" />
<item jid="pitchat@conference.weather.im" name="WWS Pittsburgh" />
<item jid="chschat@conference.weather.im" name="chschat" />
<item jid="ajkchat@conference.weather.im" name="ajkchat" />
<item jid="chachat@conference.weather.im" name="WWS Charlotte" />
<item jid="bmxchat@conference.weather.im" name="bmxchat" />
<item jid="lixchat@conference.weather.im" name="lixchat" />
<item jid="apxchat@conference.weather.im" name="apxchat" />
<item jid="hunchat@conference.weather.im" name="hunchat" />
<item jid="spcmobile2006@conference.weather.im" name="spcmobile2006" />
<item jid="zmachat@conference.weather.im" name="zmachat" />
<item jid="phl@conference.weather.im" name="PHL TRACON" />
<item jid="dtxchat@conference.weather.im" name="dtxchat" />
<item jid="wbkoweatherwatchers@conference.weather.im" name="wbkoweatherwatchers" />
<item jid="gumchat@conference.weather.im" name="gumchat" />
<item jid="gcwxchat@conference.weather.im" name="gcwxchat" />
<item jid="zzmkxchat@conference.weather.im" name="zzmkxchat" />
<item jid="dentcoeas@conference.weather.im" name="dentcoeas" />
<item jid="marfcchat@conference.weather.im" name="marfcchat" />
<item jid="easwtalk@conference.weather.im" name="easwtalk" />
<item jid="crpchat@conference.weather.im" name="crpchat" />
<item jid="gccc-nc-skywarn@conference.weather.im" name="GCCC NC Skywarn" />
<item jid="zjxchat@conference.weather.im" name="zjxchat" />
<item jid="shvchat@conference.weather.im" name="shvchat" />
<item jid="tbwchat@conference.weather.im" name="tbwchat" />
<item jid="cyschat@conference.weather.im" name="cyschat" />
<item jid="hfochat@conference.weather.im" name="hfochat" />
<item jid="dmxchat@conference.weather.im" name="Des Moines, IA" />
<item jid="mseas-weather-discussion@conference.weather.im" name="MSEAS-Weather-Discussion" />
<item jid="zsechat@conference.weather.im" name="zsechat" />
<item jid="revchat@conference.weather.im" name="revchat" />
<item jid="carchat@conference.weather.im" name="carchat" />
<item jid="msochat@conference.weather.im" name="msochat" />
<item jid="abc3340@conference.weather.im" name="abc3340" />
<item jid="keychat@conference.weather.im" name="keychat" />
<item jid="riwchat@conference.weather.im" name="riwchat" />
<item jid="awpwxchat@conference.weather.im" name="awpwxchat" />
<item jid="mhxchat@conference.weather.im" name="mhxchat" />
<item jid="caechat@conference.weather.im" name="caechat" />
<item jid="indchat@conference.weather.im" name="indchat" />
<item jid="dlhchat@conference.weather.im" name="dlhchat" />
<item jid="unrchat@conference.weather.im" name="unrchat" />
<item jid="wilchat@conference.weather.im" name="WWS Columbus/Wilmington" />
<item jid="okc_chatrooms@conference.weather.im" name="okc_chatrooms" />
<item jid="kdtxchat@conference.weather.im" name="kdtxchat" />
<item jid="zabchat@conference.weather.im" name="zabchat" />
<item jid="wnpchat@conference.weather.im" name="wnpchat" />
<item jid="zlcchat@conference.weather.im" name="zlcchat" />
<item jid="ffcchat@conference.weather.im" name="ffcchat" />
<item jid="epzchat@conference.weather.im" name="epzchat" />
<item jid="taechat@conference.weather.im" name="taechat" />
<item jid="fox6chat@conference.weather.im" name="fox6chat" />
<item jid="cbrfcchat@conference.weather.im" name="cbrfcchat" />
<item jid="wisconsin_storm_spotters@conference.weather.im" name="Wisconsin Storm Spotters" />
<item jid="tfxchat@conference.weather.im" name="tfxchat" />
<item jid="abqchat@conference.weather.im" name="abqchat" />
<item jid="nwrfcchat@conference.weather.im" name="nwrfcchat" />
<item jid="rlxchat@conference.weather.im" name="rlxchat" />
<item jid="ounchat@conference.weather.im" name="ounchat" />
<item jid="clechat@conference.weather.im" name="clechat" />
<item jid="loxchat@conference.weather.im" name="loxchat" />
<item jid="fsdchat@conference.weather.im" name="fsdchat" />
<item jid="bgmchat@conference.weather.im" name="bgmchat" />
<item jid="wgrfcchat@conference.weather.im" name="wgrfcchat" />
<item jid="ewxchat@conference.weather.im" name="ewxchat" />
<item jid="uswat@conference.weather.im" name="Uswat United States weather team" />
<item jid="iowawx@conference.weather.im" name="iowawx" />
<item jid="ohrfcchat@conference.weather.im" name="ohrfcchat" />
<item jid="serfcchat@conference.weather.im" name="serfcchat" />
<item jid="stichat@conference.weather.im" name="stichat" />
<item jid="zdvchat@conference.weather.im" name="zdvchat" />
<item jid="eaxchat@conference.weather.im" name="eaxchat" />
<item jid="iwxchat@conference.weather.im" name="iwxchat" />
<item jid="lubchat@conference.weather.im" name="lubchat" />
<item jid="whntweather@conference.weather.im" name="whntweather" />
<item jid="bufchat@conference.weather.im" name="bufchat" />
<item jid="pdtchat@conference.weather.im" name="pdtchat" />
<item jid="knsw@conference.weather.im" name="knsw" />
<item jid="mkxchat@conference.weather.im" name="mkxchat" />
<item jid="test@conference.weather.im" name="test" />
<item jid="abc3340skywatcher@conference.weather.im" name="abc3340skywatcher" />
<item jid="grbchat@conference.weather.im" name="grbchat" />
<item jid="topchat@conference.weather.im" name="topchat" />
<item jid="rnkchat@conference.weather.im" name="rnkchat" />
<item jid="lzkchat@conference.weather.im" name="lzkchat" />
<item jid="ctpchat@conference.weather.im" name="ctpchat" />
<item jid="gldchat@conference.weather.im" name="gldchat" />
<item jid="abrfcchat@conference.weather.im" name="abrfcchat" />
<item jid="byzchat@conference.weather.im" name="byzchat" />
<item jid="mpxchat@conference.weather.im" name="mpxchat" />
<item jid="zdcchat@conference.weather.im" name="zdcchat" />
<item jid="lsxchat@conference.weather.im" name="lsxchat" />
<item jid="pahchat@conference.weather.im" name="pahchat" />
<item jid="bouchat@conference.weather.im" name="Boulder, CO" />
<item jid="tsachat@conference.weather.im" name="tsachat" />
<item jid="bmxspotterchat@conference.weather.im" name="bmxspotterchat" />
<item jid="zfwchat@conference.weather.im" name="zfwchat" />
<item jid="zauchat@conference.weather.im" name="zauchat" />
<item jid="aprfcchat@conference.weather.im" name="aprfcchat" />
<item jid="wwsreport@conference.weather.im" name="WWS Report" />
<item jid="bmxalertchat@conference.weather.im" name="bmxalertchat" />
<item jid="mqtchat@conference.weather.im" name="mqtchat" />
<item jid="mafchat@conference.weather.im" name="mafchat" />
<item jid="mrxchat@conference.weather.im" name="mrxchat" />
<item jid="fgzchat@conference.weather.im" name="fgzchat" />
<item jid="twitter@conference.weather.im" name="twitter" />
<item jid="oaxchat@conference.weather.im" name="oaxchat" />
<item jid="btvchat@conference.weather.im" name="btvchat" />
<item jid="potomac_tracon@conference.weather.im" name="Potomac TRACON" />
<item jid="ictchat@conference.weather.im" name="ictchat" />
<item jid="mfrchat@conference.weather.im" name="mfrchat" />
<item jid="detroiteaschat@conference.weather.im" name="detroiteaschat" />
<item jid="hgxchat@conference.weather.im" name="hgxchat" />
<item jid="afgchat@conference.weather.im" name="afgchat" />
<item jid="sgfchat@conference.weather.im" name="sgfchat" />
<item jid="hawaii@conference.weather.im" name="Hawaii Weather" />
<item jid="cwest@conference.weather.im" name="CWEST" />
<item jid="zlachat@conference.weather.im" name="zlachat" />
<item jid="alychat@conference.weather.im" name="alychat" />
<item jid="sjtchat@conference.weather.im" name="sjtchat" />
<item jid="janchat@conference.weather.im" name="janchat" />
<item jid="gspchat@conference.weather.im" name="gspchat" />
<item jid="lwxchat@conference.weather.im" name="lwxchat" />
<item jid="gyxchat@conference.weather.im" name="gyxchat" />
<item jid="wpcchat@conference.weather.im" name="WPC Chatroom" />
<item jid="sweaseops1@conference.weather.im" name="sweaseops1" />
<item jid="scwx@conference.weather.im" name="South Carolina Weather" />
<item jid="lbfchat@conference.weather.im" name="lbfchat" />
<item jid="jaxchat@conference.weather.im" name="jaxchat" />
<item jid="nwsc@conference.weather.im" name="Nate's Weather Safety Center" />
<item jid="fgfchat@conference.weather.im" name="fgfchat" />
</root>
`;
const json = xml2json.toJson(xml, { object: true });
console.log(JSON.stringify(json, null, 2));