5 Commits

7 changed files with 95 additions and 76 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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": {

View File

@@ -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,26 +89,8 @@ 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) => {
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" ) { if ( ev.notification == "removed" ) {
ev.set_deleted( db ); ev.set_deleted( 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();

View File

@@ -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;
}
} }

View File

@@ -6,7 +6,8 @@ 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" ) ) {
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"`, {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json" "Content-Type": "application/json"
@@ -23,4 +24,10 @@ export async function sendNotification(title: string, body: string, link?: strin
}); });
const responseBody = await response.json(); const responseBody = await response.json();
return responseBody; return responseBody;
} else {
console.dir({
sendNotification: "mocking"
})
}
} }

View File

@@ -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 ) }