Compare commits
5 Commits
d303560f53
...
c1ad9c7494
| Author | SHA1 | Date | |
|---|---|---|---|
| c1ad9c7494 | |||
| e9ead4e7bf | |||
| 420076a8cf | |||
| d5a1bc9fa7 | |||
| 76dfde05f7 |
@@ -1,9 +1,15 @@
|
|||||||
|
TZ=Europe/Berlin
|
||||||
|
DB_FILEPATH=./data/db
|
||||||
|
DB_FILENAME=77th_eventntfy.db
|
||||||
|
apprise_https=false
|
||||||
|
apprise_hostname=apprise
|
||||||
|
apprise_port=8000
|
||||||
|
notification_mock=true
|
||||||
ntfy_on=true
|
ntfy_on=true
|
||||||
ntfy_username=chiko
|
ntfy_username=chiko
|
||||||
ntfy_password=Blub
|
ntfy_password=Blub
|
||||||
ntfy_host=ntfy.some-service.com
|
ntfy_host=ntfy.some-service.com
|
||||||
ntfy_topic=SomeTopic
|
ntfy_topic=SomeTopic
|
||||||
|
|
||||||
dc_on=true
|
dc_on=true
|
||||||
dc_webhook=123123123123123/ABCDEFABCDEFABCDEFABCDEFABCDEFABCDEFABCDEF
|
dc_webhook=123123123123123/ABCDEFABCDEFABCDEFABCDEFABCDEFABCDEFABCDEF
|
||||||
dc_botname=Botname Here
|
dc_botname=Botname Here
|
||||||
|
|||||||
@@ -7,6 +7,13 @@ chmod +x /etc/cron-env.sh
|
|||||||
# Write the Env Vars into a file for cron. happens during runtime of the container and not build.
|
# Write the Env Vars into a file for cron. happens during runtime of the container and not build.
|
||||||
# List your environment variables here
|
# List your environment variables here
|
||||||
env_vars=(
|
env_vars=(
|
||||||
|
TZ
|
||||||
|
DB_FILEPATH
|
||||||
|
DB_FILENAME
|
||||||
|
apprise_https
|
||||||
|
apprise_hostname
|
||||||
|
apprise_port
|
||||||
|
notification_mock
|
||||||
ntfy_on
|
ntfy_on
|
||||||
ntfy_username
|
ntfy_username
|
||||||
ntfy_password
|
ntfy_password
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"name": "eventcalender",
|
"name": "77th_eventcalendernotification",
|
||||||
"module": "./src/app.ts",
|
"module": "./src/app.ts",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
"dev:init": "bun run ./src/app.ts --init",
|
"dev:init": "bun run ./src/app.ts --init",
|
||||||
"db:init": "bun run ./run/db_init.ts",
|
"db:init": "bun run ./run/db_init.ts",
|
||||||
"db:deleteall": "bun run ./run/db_deleteall.ts",
|
"db:deleteall": "bun run ./run/db_deleteall.ts",
|
||||||
"build": "bun build --compile --minify --sourcemap ./src/app.ts --outfile ./build/77th_event_calendar_notification",
|
"build": "bun build --compile --minify --sourcemap ./src/app.ts --outfile ./build/77th_eventcalendernotification",
|
||||||
"build:linux": "bun build --compile --minify --sourcemap --target=bun-linux-arm64 ./src/app.ts --outfile ./build/77th_event_calendar_notification",
|
"build:linux": "bun build --compile --minify --sourcemap --target=bun-linux-arm64 ./src/app.ts --outfile ./build/77th_eventcalendernotification",
|
||||||
"docker:build": "docker build -t chiko/77th_eventcalendarntfy:0.1.0 ."
|
"docker:build": "docker build -t chiko/77th_eventcalendarntfy:0.1.0 ."
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
|||||||
55
src/app.ts
55
src/app.ts
@@ -1,7 +1,6 @@
|
|||||||
import { TEventType, type TEvent } from "./component/event";
|
|
||||||
import { db } from "./sql";
|
import { db } from "./sql";
|
||||||
import { Event, type TEventEntityNew, type TGetEventsOptions } from "./component/event/events";
|
import { Event, type TEventEntityNew, type TGetEventsOptions } from "./component/event/events";
|
||||||
import { createPlaceholders, getTsNow, pad_l2 } from "./util";
|
import { createPlaceholders, getTsNow } from "./util";
|
||||||
import { sendNotification } from "./sendNotification";
|
import { sendNotification } from "./sendNotification";
|
||||||
import minimist from "minimist";
|
import minimist from "minimist";
|
||||||
const argv = minimist(process.argv.slice(2))
|
const argv = minimist(process.argv.slice(2))
|
||||||
@@ -11,32 +10,6 @@ console.dir({argv})
|
|||||||
const TODAY = getTsNow();
|
const TODAY = getTsNow();
|
||||||
console.dir({TODAY});
|
console.dir({TODAY});
|
||||||
|
|
||||||
function getBodyFromEvent( event: TEvent): string {
|
|
||||||
const body = [
|
|
||||||
`Title: ${event.title}`,
|
|
||||||
`Date: ${event.date_at}`,
|
|
||||||
`Time: ${event.time_start}`,
|
|
||||||
`Type: ${ TEventType[ event.event_type ] }`,
|
|
||||||
`Location: ${event.location}`,
|
|
||||||
`By: ${event.posted_by}`,
|
|
||||||
`Link: ${event.link}`,
|
|
||||||
].join("\n");
|
|
||||||
return body;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isEventToday (event: Event | TEvent ) {
|
|
||||||
const now = getTsNow();
|
|
||||||
const [year, month, day] = event.date_at.split("-")
|
|
||||||
if (
|
|
||||||
year == String(now.year) &&
|
|
||||||
month == pad_l2( String(now.month) ) &&
|
|
||||||
day == pad_l2( String( now.day ) )
|
|
||||||
) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function events_update_db() {
|
async function events_update_db() {
|
||||||
const events_fetched_currentMonth = await Event.fetch_events( TODAY.year, TODAY.month , -120 );
|
const events_fetched_currentMonth = await Event.fetch_events( TODAY.year, TODAY.month , -120 );
|
||||||
console.log("events_fetched_currentMonth.length: " + events_fetched_currentMonth.length );
|
console.log("events_fetched_currentMonth.length: " + events_fetched_currentMonth.length );
|
||||||
@@ -116,27 +89,9 @@ async function events_check_for_notification() {
|
|||||||
});
|
});
|
||||||
for ( const ev of list_of_events ) {
|
for ( const ev of list_of_events ) {
|
||||||
console.log("loop list_of_events - ev: " + [ ev.uid, ev.title, ev.date_at, "notification: " + ev.notification ].join( ", " ) );
|
console.log("loop list_of_events - ev: " + [ ev.uid, ev.title, ev.date_at, "notification: " + ev.notification ].join( ", " ) );
|
||||||
const body = getBodyFromEvent( ev );
|
console.log("loop list_of_events - ev 'title': " + ev.get_title() );
|
||||||
// console.log("loop list_of_events - ev 'body': " + body );
|
await sendNotification( ev.get_title(), ev.get_body() );
|
||||||
const type_of_notification = ( (event: Event) => {
|
if ( ev.notification == "removed" ) {
|
||||||
switch ( event.notification ) {
|
|
||||||
case "new":
|
|
||||||
return "New";
|
|
||||||
case "changed":
|
|
||||||
return "Changed";
|
|
||||||
case "removed":
|
|
||||||
return "Removed";
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
} ) ( ev );
|
|
||||||
const title_prefix_arr = [];
|
|
||||||
if ( type_of_notification ) title_prefix_arr.push( "<" + type_of_notification + ">" );
|
|
||||||
if ( isEventToday( ev ) ) title_prefix_arr.push( "<TODAY>" )
|
|
||||||
const title = `${title_prefix_arr.length >= 1 ? ( title_prefix_arr.join(" " ) + " - ") : "" }${ev.title} (${ TEventType[ ev.event_type ] })`;
|
|
||||||
console.log("loop list_of_events - ev 'title': " + title );
|
|
||||||
await sendNotification( title, body);
|
|
||||||
if( ev.notification == "removed" ) {
|
|
||||||
ev.set_deleted( db );
|
ev.set_deleted( db );
|
||||||
}
|
}
|
||||||
ev.set_notification("done", db);
|
ev.set_notification("done", db);
|
||||||
@@ -145,10 +100,8 @@ async function events_check_for_notification() {
|
|||||||
|
|
||||||
async function main ( ) {
|
async function main ( ) {
|
||||||
console.log("Excecuting main()");
|
console.log("Excecuting main()");
|
||||||
|
|
||||||
await events_update_db();
|
await events_update_db();
|
||||||
await events_check_for_notification();
|
await events_check_for_notification();
|
||||||
};
|
};
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Database } from "bun:sqlite";
|
import { Database } from "bun:sqlite";
|
||||||
import type { TEvent } from "./event.types";
|
import { TEventType, type TEvent } from "./event.types";
|
||||||
import { transformArray } from "../../util";
|
import { getTsNow, pad_l2, transformArray } from "../../util";
|
||||||
|
|
||||||
const BASE_URL = "https://77th-jsoc.com/service.php?action=get_events";
|
const BASE_URL = "https://77th-jsoc.com/service.php?action=get_events";
|
||||||
|
|
||||||
@@ -176,4 +176,47 @@ export class Event implements TEventEntity {
|
|||||||
});
|
});
|
||||||
return this.syncWithDb( db );
|
return this.syncWithDb( db );
|
||||||
}
|
}
|
||||||
|
get_title() {
|
||||||
|
const type_of_notification = ( (event: Event) => {
|
||||||
|
switch ( event.notification ) {
|
||||||
|
case "new":
|
||||||
|
return "New";
|
||||||
|
case "changed":
|
||||||
|
return "Changed";
|
||||||
|
case "removed":
|
||||||
|
return "Removed";
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} ) ( this );
|
||||||
|
const title_prefix_arr = [];
|
||||||
|
if ( type_of_notification ) title_prefix_arr.push( "<" + type_of_notification + ">" );
|
||||||
|
if ( this.isEventToday() ) title_prefix_arr.push( "<TODAY>" )
|
||||||
|
return `${title_prefix_arr.length >= 1 ? ( title_prefix_arr.join(" " ) + " - ") : "" }${this.title} (${ TEventType[ this.event_type ] })`;
|
||||||
|
}
|
||||||
|
get_body() {
|
||||||
|
const body = [
|
||||||
|
`Title: ${this.title}`,
|
||||||
|
`Date: ${this.date_at}`,
|
||||||
|
`Time: ${this.time_start}`,
|
||||||
|
`Type: ${ TEventType[ this.event_type ] }`,
|
||||||
|
`Location: ${this.location}`,
|
||||||
|
`By: ${this.posted_by}`,
|
||||||
|
`Link: ${this.link}`,
|
||||||
|
].join("\n");
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
isEventToday ( ) {
|
||||||
|
const now = getTsNow();
|
||||||
|
const [year, month, day] = this.date_at.split("-")
|
||||||
|
if (
|
||||||
|
year == String(now.year) &&
|
||||||
|
month == pad_l2( String(now.month) ) &&
|
||||||
|
day == pad_l2( String( now.day ) )
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -6,21 +6,28 @@ export async function sendNotification(title: string, body: string, link?: strin
|
|||||||
link
|
link
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const response = await fetch("http://apprise:8000/notify", {
|
if ( ! ( process.env.notification_mock == "true" ) ) {
|
||||||
method: "POST",
|
const response = await fetch(`${ process.env.apprise_https == "true" ? "https" : "http"}://${process.env.apprise_host ? process.env.apprise_host : "apprise"}:${process.env.apprise_port ? String(process.env.apprise_port) : "80" }/notify"`, {
|
||||||
headers: {
|
method: "POST",
|
||||||
"Content-Type": "application/json"
|
headers: {
|
||||||
},
|
"Content-Type": "application/json"
|
||||||
body: JSON.stringify({
|
},
|
||||||
urls: [
|
body: JSON.stringify({
|
||||||
`ntfys://${process.env.ntfy_username}:${process.env.ntfy_password}@${process.env.ntfy_host}/${process.env.ntfy_topic}${ link ? `?click=${link}`: "?click=https://77th-jsoc.com/#/events" }`,
|
urls: [
|
||||||
`discord://${process.env.dc_webhook}?avatar_url=${process.env.dc_avatar_url}&botname=${process.env.dc_botname}`
|
`ntfys://${process.env.ntfy_username}:${process.env.ntfy_password}@${process.env.ntfy_host}/${process.env.ntfy_topic}${ link ? `?click=${link}`: "?click=https://77th-jsoc.com/#/events" }`,
|
||||||
].join(","),
|
`discord://${process.env.dc_webhook}?avatar_url=${process.env.dc_avatar_url}&botname=${process.env.dc_botname}`
|
||||||
title: title,
|
].join(","),
|
||||||
body: body,
|
title: title,
|
||||||
format: "markdown"
|
body: body,
|
||||||
|
format: "markdown"
|
||||||
|
})
|
||||||
|
});
|
||||||
|
const responseBody = await response.json();
|
||||||
|
return responseBody;
|
||||||
|
} else {
|
||||||
|
console.dir({
|
||||||
|
sendNotification: "mocking"
|
||||||
})
|
})
|
||||||
});
|
}
|
||||||
const responseBody = await response.json();
|
|
||||||
return responseBody;
|
|
||||||
}
|
}
|
||||||
@@ -39,3 +39,6 @@ export function getTsNow() {
|
|||||||
}
|
}
|
||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function unixToDate( unix_timestamp: number ) { return new Date(unix_timestamp * 1000) }
|
||||||
|
export function dateToUnix( date: Date ) { return Math.round( date.getTime()/1000 ) }
|
||||||
Reference in New Issue
Block a user