121 lines
2.8 KiB
D
121 lines
2.8 KiB
D
module util;
|
|
import asdf;
|
|
|
|
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;
|
|
}
|
|
|
|
struct JsonObject {
|
|
import mir.conv: to;
|
|
string raw;
|
|
|
|
SerdeException deserializeFromAsdf(Asdf data) {
|
|
this.raw = data.to!string;
|
|
return null;
|
|
}
|
|
|
|
void serialize(S)(ref S serializer) {
|
|
try serializer.sink.putSmallEscaped(data.parseJson.to!string);
|
|
catch (Exception) serializer.sink.putSmallEscaped("{}");
|
|
}
|
|
}
|
|
|
|
struct EventWithoutRoomID {
|
|
JsonObject content;
|
|
string event_id;
|
|
ulong origin_server_ts;
|
|
@serdeOptional string sender, state_key, type;
|
|
// Unsigned unsigned;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
@serdeOptional Timeline timeline;
|
|
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";
|
|
}
|
|
|
|
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;
|
|
} |