add server-side player vita database

The server keeps track of every player ID that ever connected successfully.
This database stores the last names and IPs used by the player and the
last countries the connections came from. Some stats are counted, like
"time connected" and "total tks". Most importantly, the database stores
rights (like admin) and restrictions (like ban). All rights and
restrictions are kept as dates (or timecodes), so, for example, if your
ban date is in the future, you are banned - and if it's in the past, you
can play. The collected stats are meant to help server owners at managing
players - especially, if they want to give someone admin rights.

The database is periodically saved to a file and read from that file on
startup. The default file is config/servervita.cfg and one backup is kept
in config/servervita_bak.cfg. During server start, if the regular file
can't be loaded, the backup is tried instead.

While the server is running, it checks periodically for a file named
config/servervita_update.cfg, and if the file exists, it is renamed to
a backup filename including a timecode and read and merged into the
database. The automatic rename makes sure, that a file is only read once.
Using such updates, a server owner can easily give several people admin
rights or for example, add clan tags for a whole list of IDs. (Yes, the
database also stores a clan tag for every ID...)

The database also stores two short comments for every ID. One can only be
read by server admins, but the other one is public. The public reason, for
example, can state a reason for a ban.

One database record takes up 264 bytes of RAM. During autosave, accounts,
that have not been used for a specified time (default 12 months), will
not be written. After a server restart, those old records will be gone.

Currently, there is no process in place, to also clean up old records
from RAM. Maybe, that'll be added later...
This commit is contained in:
ac-stef
2017-06-27 15:15:23 +02:00
parent 035d7caf2f
commit 0b656d2380
13 changed files with 344 additions and 45 deletions
+32
View File
@@ -391,6 +391,7 @@ void filterrichtext(char *dst, const char *src, int len)
case 'a': c = '\a'; break;
case 't': c = '\t'; break;
case 'n': c = '\n'; break;
case '_': c = ' '; break;
case 'x':
b = 16;
c = *++src;
@@ -410,6 +411,37 @@ void filterrichtext(char *dst, const char *src, int len)
*dst = '\0';
}
// counterpart of filterrichtext
const char *escapestring(const char *s, bool force, bool noquotes, vector<char> *buf)
{
static vector<char> strbuf[3];
static int stridx = 0;
extern bool isdedicated;
if(noquotes) force = false;
if(!s) return force ? "\"\"" : "";
if(!force && !*(s + strcspn(s, "\"/\\;()[] \f\t\a\n\r$"))) return s;
if(!buf) buf = &strbuf[stridx++];
stridx %= 3;
buf->setsize(0);
if(!noquotes) buf->add('"');
for(; *s; s++) switch(*s)
{
case '\n': buf->put("\\n", 2); break;
case '\r': buf->put("\\n", 2); break;
case '\t': buf->put("\\t", 2); break;
case '\a': buf->put("\\a", 2); break;
case '\f': buf->put("\\f", 2); break;
case '"': buf->put("\\\"", 2); break;
case '\\': buf->put("\\\\", 2); break;
case ' ': if(isdedicated) { buf->put("\\_", 2); break; }
default: buf->add(*s); break;
}
if(!noquotes) buf->add('"');
buf->add(0);
return buf->getbuf();
}
// ensures, that d is either two lowercase chars or ""
void filterlang(char *d, const char *s)