string Social_invite_accept;
+int Social_db = -1;
+
+STATIC_INIT(Social) {
+ Social_db = db_load("social.db");
+}
+
+string Social_get(int id)
+{
+ string s = db_get(Social_db, itos(id));
+ if (s == "") s = sprintf("Player %d", id);
+ return s;
+}
+
void Social_parse(entity fh, entity pass, int status)
{
switch (status) {
case "ping":
Social_send(id, "pong");
case "pong":
- printf("Player %d is online\n", id);
+ string who = Social_get(id);
+ printf("%s is online\n", who);
break;
case "msg":
for (string input; (input = url_fgets(fh)); ) {
break;
case "invite": {
string s = url_fgets(fh);
- printf("Player %d has invited you to %s; `menu_cmd saccept` to join\n", id, s);
+ string who = Social_get(id);
+ printf("%s has invited you to %s; `menu_cmd saccept` to join\n", who, s);
Social_invite_accept = sprintf("\nconnect %s\n", s);
break;
}
MUTATOR_HOOKFUNCTION(social, GameCommand) {
if (MUTATOR_RETURNVALUE) return false; // command was already handled
+ if (cmd_name == "sadd" && cmd_argc >= 3) {
+ int id = stoi(argv(1));
+ string nick = substring(cmd_string, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
+ db_put(Social_db, itos(id), nick);
+ return true;
+ }
+ if (cmd_name == "sremove" && cmd_argc == 2) {
+ int id = stoi(argv(1));
+ db_delete(Social_db, itos(id));
+ return true;
+ }
+ if (cmd_name == "slist") {
+ FOREACH_DB(Social_db, LAMBDA(
+ printf("%s: %s\n", k, v);
+ ));
+ return true;
+ }
if (cmd_name == "ssend" && cmd_argc >= 3) {
int to = stoi(argv(1));
string msg = substring(cmd_string, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
return db;
}
-void db_dump(float db, string pFilename)
+void db_dump(int db, string pFilename)
{
- float fh, i, j, n, m;
- fh = fopen(pFilename, FILE_WRITE);
- if(fh < 0)
+ int fh = fopen(pFilename, FILE_WRITE);
+ if (fh < 0)
error(strcat("Can't dump DB to ", pFilename));
- n = buf_getsize(db);
fputs(fh, "0\n");
- for(i = 0; i < n; ++i)
- {
- m = tokenizebyseparator(bufstr_get(db, i), "\\");
- for(j = 2; j < m; j += 2)
- fputs(fh, strcat("\\", argv(j-1), "\\", argv(j), "\n"));
- }
+ FOREACH_DB(db, LAMBDA(
+ fputs(fh, strcat("\\", k, "\\", v, "\n"));
+ ));
fclose(fh);
}
string db_get(float db, string pKey)
{
- float h;
- h = crc16(false, pKey) % DB_BUCKETS;
+ int h = crc16(false, pKey) % DB_BUCKETS;
return uri_unescape(infoget(bufstr_get(db, h), pKey));
}
void db_put(float db, string pKey, string pValue)
{
- float h;
- h = crc16(false, pKey) % DB_BUCKETS;
+ int h = crc16(false, pKey) % DB_BUCKETS;
bufstr_set(db, h, infoadd(bufstr_get(db, h), pKey, uri_escape(pValue)));
}
+void db_delete(float db, string pKey)
+{
+ db_put(db, pKey, string_null);
+}
+
void db_test()
{
float db, i;
void db_close(int db);
string db_get(int db, string key);
void db_put(int db, string key, string value);
+void db_delete(float db, string pKey);
+#define FOREACH_INFO(s, f) do { \
+ string __s = s; \
+ int __m = tokenizebyseparator(__s, "\\"); \
+ for (int __j = 2; __j < __m; __j += 2) { \
+ string k = argv(__j - 1), v = argv(__j); \
+ f; \
+ } \
+} while (0)
+#define FOREACH_BUF(db, f) do { \
+ int __db = db; \
+ int __n = buf_getsize(__db); \
+ for (int __i = 0; __i < __n; ++__i) { \
+ f; \
+ } \
+} while (0)
+#define FOREACH_DB(db, f) do { \
+ FOREACH_BUF(db, FOREACH_INFO(bufstr_get(__db, __i), f)); \
+} while (0)
// stringbuffer loading/saving
int buf_load(string filename);