initial commit
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.env
|
||||||
|
statusbot
|
||||||
|
statusbot.o
|
||||||
23
Dockerfile
Normal file
23
Dockerfile
Normal 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
2
cronjob
Normal 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
10
docker-compose.yml
Normal 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
5
env-example
Normal 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
84
statusbot.pas
Normal 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.
|
||||||
Reference in New Issue
Block a user