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; }