initial commit

This commit is contained in:
2026-01-24 23:30:40 +01:00
commit b098ecca9d
6 changed files with 127 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.env
statusbot
statusbot.o

23
Dockerfile Normal file
View File

@@ -0,0 +1,23 @@
# Dockerfile - FPC Discord bot SSL támogatással
FROM debian:12-slim
RUN apt-get update && apt-get install -y \
fpc fp-units-fcl fp-units-net tzdata curl jq \
libssl3 libssl-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY statusbot.pas .
# Fordítás
RUN fpc statusbot.pas
# Cron telepítése
RUN apt-get update && apt-get install -y cron && apt-get clean && rm -rf /var/lib/apt/lists/*
# Cron fájl másolása
COPY cronjob /etc/cron.d/discord-cron
RUN chmod 0644 /etc/cron.d/discord-cron && crontab /etc/cron.d/discord-cron
# Konténer mindig fusson, cron háttérben
CMD ["cron", "-f"]

2
cronjob Normal file
View File

@@ -0,0 +1,2 @@
# cronjob - minden kedd 9:00 magyar idő szerint
0 9 * * 2 root TZ=Europe/Budapest /app/statusbot

10
docker-compose.yml Normal file
View File

@@ -0,0 +1,10 @@
services:
statusbot:
build: .
container_name: statusbot
environment:
DISCORD_BOT_TOKEN: "${DISCORD_BOT_TOKEN}"
DISCORD_CHANNEL_ID: "${DISCORD_CHANNEL_ID}"
THREAD_NAME: "${THREAD_NAME}"
THREAD_MESSAGE: "${THREAD_MESSAGE}"
ARCHIVE_DURATION: "${ARCHIVE_DURATION}"

5
env-example Normal file
View File

@@ -0,0 +1,5 @@
DISCORD_BOT_TOKEN=DISCORD_BOT_TOKEN
DISCORD_CHANNEL_ID=DISCORD_CHANNEL_ID
ARCHIVE_DURATION=10080
THREAD_NAME="Weekly Status"
THREAD_MESSAGE="<@&<ROLE_ID>> Please post your weekly status update here!"

84
statusbot.pas Normal file
View File

@@ -0,0 +1,84 @@
program DiscordCreateThread;
{$MODE OBJFPC}
{$H+} // Enable AnsiString
uses
SysUtils, Classes, fphttpclient, opensslsockets, DateUtils;
const
DISCORD_API = 'https://discord.com/api/v10';
function GetEnvDef(const Name, Def: string): string;
begin
if GetEnvironmentVariable(Name) = '' then
GetEnvDef := Def
else
GetEnvDef := GetEnvironmentVariable(Name);
end;
function GetArchiveDuration: Integer;
begin
GetArchiveDuration := StrToIntDef(GetEnvironmentVariable('ARCHIVE_DURATION'), 10080);
end;
function GetThreadName: string;
var
Base: string;
begin
Base := GetEnvironmentVariable('THREAD_NAME');
GetThreadName := Base + ' (' + FormatDateTime('yyyy-mm-dd', Now) + ')';
end;
function HttpPost(const URL, Body, Token: string): string;
var
Client: TFPHttpClient;
BodyStream, ResponseStream: TStringStream;
begin
Client := TFPHttpClient.Create(nil);
BodyStream := TStringStream.Create(Body);
ResponseStream := TStringStream.Create('');
try
Client.AddHeader('Authorization', 'Bot ' + Token);
Client.AddHeader('Content-Type', 'application/json');
Client.RequestBody := BodyStream;
Client.Post(URL, ResponseStream);
HttpPost := ResponseStream.DataString;
finally
ResponseStream.Free;
BodyStream.Free;
Client.Free;
end;
end;
var
Token, ChannelID, ThreadMessage: string;
ThreadBody, MessageBody, Response: string;
ThreadIDStart, ThreadIDEnd: Integer;
ThreadID: string;
begin
Token := GetEnvironmentVariable('DISCORD_BOT_TOKEN');
ChannelID := GetEnvironmentVariable('DISCORD_CHANNEL_ID');
ThreadMessage := GetEnvironmentVariable('THREAD_MESSAGE');
ThreadBody := Format(
'{"name":"%s","auto_archive_duration":%d}',
[StringReplace(GetThreadName,'"','\"',[rfReplaceAll]), GetArchiveDuration]
);
Response := HttpPost(DISCORD_API + '/channels/' + ChannelID + '/threads', ThreadBody, Token);
// egyszerű parsing az id kinyeréséhez
ThreadIDStart := Pos('"id":"', Response);
if ThreadIDStart > 0 then
begin
Inc(ThreadIDStart, 6);
ThreadIDEnd := Pos('"', Response, ThreadIDStart);
ThreadID := Copy(Response, ThreadIDStart, ThreadIDEnd - ThreadIDStart);
if ThreadID <> '' then
begin
MessageBody := Format('{"content":"%s"}',[StringReplace(ThreadMessage,'"','\"',[rfReplaceAll])]);
HttpPost(DISCORD_API + '/channels/' + ThreadID + '/messages', MessageBody, Token);
end;
end;
end.