skunkybot-d/source/util.d

121 lines
2.8 KiB
D
Raw Permalink Normal View History

2025-01-08 14:24:48 +00:00
module util;
import asdf;
2025-01-18 21:55:34 +00:00
string homeserver;
string intToStr(T)(T num) {
char[] buf;
for(short i; num > 0; ++i) {
buf = (num % 10 + '0')~buf;
num /= 10;
} return cast(string)buf;
}
2025-01-08 14:24:48 +00:00
struct JsonObject {
import mir.conv: to;
2025-01-18 21:55:34 +00:00
string raw;
2025-01-08 14:24:48 +00:00
SerdeException deserializeFromAsdf(Asdf data) {
2025-01-18 21:55:34 +00:00
this.raw = data.to!string;
2025-01-08 14:24:48 +00:00
return null;
}
void serialize(S)(ref S serializer) {
try serializer.sink.putSmallEscaped(data.parseJson.to!string);
catch (Exception) serializer.sink.putSmallEscaped("{}");
}
}
2025-01-18 21:55:34 +00:00
struct EventWithoutRoomID {
JsonObject content;
string event_id;
ulong origin_server_ts;
@serdeOptional string sender, state_key, type;
// Unsigned unsigned;
}
2025-01-08 14:24:48 +00:00
struct Sync {
struct StrippedStateEvent {
JsonObject content;
string sender, state_key, type;
}
struct Unsigned {
int age;
string membership, transaction_id;
}
struct Rooms {
struct Invited {
struct IS { StrippedStateEvent[] events; }
IS invite_state;
}
struct Joined {
struct Timeline {
EventWithoutRoomID[] events;
bool limited;
string prev_batch;
}
struct UNC {
int highlight_count;
int notification_count;
}
2025-01-18 21:55:34 +00:00
@serdeOptional Timeline timeline;
2025-01-08 14:24:48 +00:00
UNC unread_notifications;
}
@serdeOptional Invited[string] invite;
@serdeOptional Joined[string] join;
}
@serdeOptional Rooms rooms;
string next_batch;
}
// EVENTS
struct MSG {
string body;
@serdeOptional @serdeIgnoreDefault string formatted_body;
string msgtype = "m.notice";
@serdeOptional string format = "org.matrix.custom.html";
2025-01-18 21:55:34 +00:00
}
struct Arguments {
string raw;
string command;
string[] parsed;
string[string] options;
}
auto parseMsg(string cmd) {
Arguments argz = Arguments(cmd);
if (argz.raw[0] == '#') {
string buf;
for (ulong i = 1; i < argz.raw.length; ++i)
if (argz.raw[i] != ' ' && argz.raw[i] != '=') {
buf ~= argz.raw[i];
if (i+1 == argz.raw.length || (argz.raw[i+1] == ' ' || argz.raw[i+1] == '=')) {
argz.parsed ~= buf;
buf = null;
}
}
argz.command = argz.parsed[0]; argz.parsed = argz.parsed[1..$];
for (ulong i; i < argz.parsed.length; ++i)
if (argz.parsed[i][0] == '-') {
string key = argz.parsed[i];
auto val = (i+1 < argz.parsed.length && argz.parsed[i+1][0] != '-')
? argz.parsed[i+1] : null;
if (key[1] == '-') argz.options[key[2..$]] = val;
else for (ulong x = 1; x < key.length; ++x)
argz.options[key[x..x+1]] = val;
auto x = (val) ? i + 2 : i + 1;
argz.parsed = argz.parsed[0..i] ~ argz.parsed[x..$];
i = i - (x - i);
}
}
return argz;
2025-01-08 14:24:48 +00:00
}