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.