module commands.util; struct Command { string description = "No description provided"; string name; } static enum Time: int { @('s') second = 1, @('m') minute = 60 * second, @('h') hour = 60 * minute, @('d') day = 24 * hour, @('w') week = 7 * day, @('M') month = 30 * day, @('y') year = 12 * month } struct Arguments { string raw; string command; string[] parsed; char[] options; string getArg(string arg) @nogc { int prev, splt; for (int i; i < options.length; ++i) { if (options[i] == '\0') splt = i; else if (options[i] == '\1') { if (arg == options[prev..splt]) return cast(string)options[splt+1..i]; prev = i + 1; } } return null; } } auto parseMsg(string cmd) { import std.stdio; 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..$] ~ '\0' ~ val ~ '\1'; else for (ulong x = 1; x < key.length; ++x) argz.options ~= key[x..x+1] ~ '\0' ~ val ~ '\1'; auto x = (val) ? i + 2 : i + 1; argz.parsed = argz.parsed[0..i] ~ argz.parsed[x..$]; i = i - (x - i); } } return argz; } int getUsrPL(string room, string user) { import main: db; auto q = db.query("select pl from room_pls where room = ? and user = ?", room, user); if (q.step) return q.get!int; return 0; } short[string] getUsrsPLs(string room) { struct hz { string user; short pl; } import main: db; short[string] buf; auto q = db.query("select user, pl from room_pls where room = ?", room); while (q.step) { auto x = q.get!hz; buf[x.user] = x.pl; } return buf; }