neptune/source/app.d

104 lines
2.3 KiB
D
Raw Normal View History

2025-03-11 01:01:54 +03:00
module main;
2025-01-08 17:24:48 +03:00
import std.stdio: writeln;
import asdf: deserialize, serializeToJson;
import util;
2025-03-11 01:01:54 +03:00
import listener;
2025-01-08 17:24:48 +03:00
2025-03-11 01:01:54 +03:00
import database.sqlite.db;
__gshared SQLite3DB db;
2025-01-08 17:24:48 +03:00
2025-03-11 01:01:54 +03:00
int main(string[] args) {
import core.stdc.stdio;
2025-01-08 17:24:48 +03:00
2025-03-11 01:01:54 +03:00
char buf;
char[] fileStr;
auto file = fopen("config.json", "r");
if (file is null) return 1;
while ((buf = cast(char)fgetc(file)) != 255)
fileStr ~= buf;
fclose(file);
cfg = fileStr.deserialize!Config;
cfg.token = "Authorization: Bearer " ~ cfg.token;
2025-01-08 17:24:48 +03:00
2025-03-11 01:01:54 +03:00
if (args.length == 5 && args[1] == "get-token") {
auto rq = mkrqst(
args[2]~"/_matrix/client/v3/login", "POST",
`{
"identifier": {
"type": "m.id.user",
"user": "`~args[3]~`"
},
"initial_device_display_name": "Neptune Bot",
"password": "`~args[4]~`",
"type": "m.login.password"
}`,
true
);
2025-01-08 17:24:48 +03:00
2025-03-11 01:01:54 +03:00
if (rq.status != 200) {
writeln("Something went wrong :(\n", rq.body);
return 1;
2025-01-19 00:55:34 +03:00
}
2025-03-11 01:01:54 +03:00
struct Login {
string access_token;
2025-01-08 17:24:48 +03:00
}
2025-03-11 01:01:54 +03:00
writeln("Your access token: \033[0;32m", (rq.body.deserialize!Login).access_token, "\033[0m.\n",
"Save it!");
return 0;
}
init;
import core.thread;
import commands.slaves;
alias sl = commands.slaves;
static foreach (member; __traits(allMembers, sl)) {
static foreach (attr; __traits(getAttributes, __traits(getMember, sl, member))) {
static if (is(attr == Parallel)) {
new Thread(&__traits(getMember, sl, member)).start;
2025-01-08 17:24:48 +03:00
}
}
}
2025-03-11 01:01:54 +03:00
import commands.apod,
commands.misc,
commands.mozhi,
commands.moderation;
listen!(
commands.apod,
commands.misc,
commands.mozhi,
commands.moderation,
);
return 0;
}
// https://m.lost-skunk.cc/_matrix/client/v3/presence/@me:lost-skunk.cc/status
void init() {
db = SQLite3DB(cfg.database_path);
syncUrl = "/_matrix/client/v3/sync?set_presence=online";
db.exec("create table if not exists client (latest_batch string)");
db.exec("create table if not exists room_pls (room string, user string, pl integer)");
auto q = db.query("select latest_batch from client");
if (q.step) initialBatch = q.get!string;
else {
import api_data: Sync;
writeln("starting initial sync..");
Sync snk = mkhsrq(syncUrl).body.deserialize!Sync;
initialBatch = snk.next_batch;
db.exec("insert into client (latest_batch) values (?)", initialBatch);
writeln("done!");
foreach(room; snk.rooms.join.keys) fetchMembers(room);
}
syncUrl ~= "&since=";
2025-01-08 17:24:48 +03:00
}