123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- #define VERSION_MAJOR 0
- #define VERSION_MINOR 1
- #ifndef VERSION_TYPE
- #define VERSION_TYPE "dev"
- #endif
- #define PATH_MAX 256
- #define PATH_SEP "/"
- #include <MagiDoor.h>
- #include <sqlite3.h>
- #if defined(_MSC_VER) || defined(WIN32)
- #define snprintf _snprintf
- #define strcasecmp _stricmp
- #include <winsock2.h>
- #ifndef _MSC_VER
- #define _MSC_VER 1
- #endif
- #else
- #include <arpa/inet.h>
- #endif
- #include <time.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <stdarg.h>
- #include <ctype.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h> // stat
- char * log_path = "logs";
- int inuse = 0;
- int debug = 0;
- typedef struct user_info {
- int uid;
- int experience;
-
- int guns;
- int fuel;
- int metal;
- int armors;
- int shields;
- int hitpoints;
- int armorpoints;
- int shieldpoints;
- char nick[256];
- char real[256];
- } user_inf;
- void dolog(char *fmt, ...) {
-
- char buffer[PATH_MAX];
- struct tm *time_now;
- time_t timen;
- FILE *logfptr;
- timen = time(NULL);
- time_now = localtime(&timen);
- if (log_path != NULL) {
- snprintf(buffer, PATH_MAX, "%s%s%04d%02d%02d.log", log_path, PATH_SEP,
- time_now->tm_year + 1900, time_now->tm_mon + 1, time_now->tm_mday);
- } else {
- snprintf(buffer, PATH_MAX, "%04d%02d%02d.log", time_now->tm_year + 1900,
- time_now->tm_mon + 1, time_now->tm_mday);
- }
- logfptr = fopen(buffer, "a");
- if (!logfptr) {
- return;
- }
- va_list ap;
- va_start(ap, fmt);
- vsnprintf(buffer, 512, fmt, ap);
- va_end(ap);
- fprintf(logfptr, "%02d:%02d:%02d %s\n", time_now->tm_hour, time_now->tm_min,
- time_now->tm_sec, buffer);
- fclose(logfptr);
- }
- void db_test() {
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[256];
- char strbuffer[256];
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) {
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
-
- strcpy(sqlbuffer, "SELECT * FROM user;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer), &stmt, NULL);
- while(sqlite3_step(stmt) == SQLITE_ROW) {
-
- md_printf("`white`%s=%d %s=%s %s=%s %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d %s=%d\r\n",
- sqlite3_column_name(stmt, 0),
- sqlite3_column_int(stmt, 0),
- sqlite3_column_name(stmt, 1),
- sqlite3_column_text(stmt, 1),
- sqlite3_column_name(stmt, 2),
- sqlite3_column_text(stmt, 2),
- sqlite3_column_name(stmt, 3),
- sqlite3_column_int(stmt, 3),
- sqlite3_column_name(stmt, 4),
- sqlite3_column_int(stmt, 4),
- sqlite3_column_name(stmt, 5),
- sqlite3_column_int(stmt, 5),
- sqlite3_column_name(stmt, 6),
- sqlite3_column_int(stmt, 6),
- sqlite3_column_name(stmt, 7),
- sqlite3_column_int(stmt, 7),
- sqlite3_column_name(stmt, 8),
- sqlite3_column_int(stmt, 8),
- sqlite3_column_name(stmt, 9),
- sqlite3_column_int(stmt, 9),
- sqlite3_column_name(stmt, 10),
- sqlite3_column_int(stmt, 10),
- sqlite3_column_name(stmt, 11),
- sqlite3_column_int(stmt, 11)
- );
- }
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- }
- int check_lock() {
-
- struct stat s;
- if (stat("lock.flg", &s) == 0) {
- return 1;
- } else {
- return 0;
- }
- }
- void grab_lock() {
-
- int valid = check_lock();
- FILE *fhandle;
- if (valid == 0) {
- fhandle = fopen("lock.flg", "w");
- if(!fhandle) {
- dolog("E: Unable to make lock.flg!");
- fprintf(stderr, "Unable to establish lock!\r\n");
- md_exit(-1);
- }
- fprintf(fhandle, "I am in use already!\n");
- fclose(fhandle);
- } else {
- dolog("W: Lock already established!");
- }
- }
- void rel_lock() {
-
- int valid = check_lock();
- if (valid == 1) {
- if (unlink("lock.flg") != 0) {
- dolog("E: Unable to release lock.flg!");
- fprintf(stderr, "Unable to release lock!\r\n");
- md_exit(-1);
- }
- } else {
- dolog("W: Lock already released!");
- }
- }
- void log_drop() {
-
-
- md_printf("`white`First=%s Last=%s Alias=%s TimeLeft=%d SecLevel=%d Location=%s Node=%d Socket=%d Sysop=%s\r\n",
- mdcontrol.user_firstname,
- mdcontrol.user_lastname,
- mdcontrol.user_alias,
- mdcontrol.user_timeleft,
- mdcontrol.user_seclevel,
- mdcontrol.user_location,
- mdcontrol.node,
- mdcontrol.socket,
- mdcontrol.sysop_name
- );
- }
- void paws() {
-
- md_printf("`white`Press any key to continue...");
- md_getc();
- md_printf("\r\n");
- }
- int locate_player(char first[], char last[]) {
-
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[256];
- int result = 0;
- char name[256];
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) {
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
-
- strcpy(name, "");
- strcat(name, first);
- strcat(name, " ");
- strcat(name, last);
-
-
- strcpy(sqlbuffer, "SELECT * from user where real=? COLLATE NOCASE;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL);
- sqlite3_bind_text(stmt, 1, name, strlen(name), SQLITE_STATIC);
- rc = sqlite3_step(stmt);
- if (rc == SQLITE_ROW) {
-
- result = sqlite3_column_int(stmt, 0);
- } else {
- dolog("W: Unable to locate user=%s", name);
- result = 0;
- }
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- return result;
- }
- user_inf load_player(int uuid) {
-
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[256];
- user_inf result;
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) {
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
- strcpy(sqlbuffer, "SELECT * from user where uid=?;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL);
- sqlite3_bind_int(stmt, uuid, 1);
- rc = sqlite3_step(stmt);
- if (rc == SQLITE_ROW) {
- result.uid = sqlite3_column_int(stmt, 0);
- strcpy(result.nick, sqlite3_column_text(stmt, 1));
- strcpy(result.real, sqlite3_column_text(stmt, 2));
- result.experience = sqlite3_column_int(stmt, 3);
- result.metal = sqlite3_column_int(stmt, 4);
- result.fuel = sqlite3_column_int(stmt, 5);
- result.guns = sqlite3_column_int(stmt, 6);
- result.armors = sqlite3_column_int(stmt, 7);
- result.shields = sqlite3_column_int(stmt, 8);
- result.armorpoints = sqlite3_column_int(stmt, 9);
- result.shieldpoints = sqlite3_column_int(stmt, 10);
- result.hitpoints = sqlite3_column_int(stmt, 11);
- } else {
- dolog("E: Unable to locate user with id=%d", uuid);
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- md_exit(-1);
- }
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- return result;
- }
- void update_player(user_inf data) {
- sqlite3 *db;
- sqlite3_stmt *stmt;
- char sqlbuffer[1024];
- int rc = sqlite3_open("spaceconstruct.db3", &db);
- if(rc) {
- dolog("E: failed opening database %s", sqlite3_errmsg(db));
- sqlite3_close(db);
- md_exit(1);
- }
- sqlite3_busy_timeout(db, 5000);
-
-
-
- strcpy(sqlbuffer, "UPDATE user SET nick=?, experience=?, metal=?, fuel=?, guns=?, armors=?, shields=?, armorpoints=?, shieldpoints=?, hitpoints=? WHERE uid=?;");
- sqlite3_prepare_v2(db, sqlbuffer, strlen(sqlbuffer) + 1, &stmt, NULL);
-
- sqlite3_bind_text(stmt, 1, data.nick, strlen(data.nick), SQLITE_STATIC);
- sqlite3_bind_int(stmt, 2, data.experience);
- sqlite3_bind_int(stmt, 3, data.metal);
- sqlite3_bind_int(stmt, 4, data.fuel);
- sqlite3_bind_int(stmt, 5, data.guns);
- sqlite3_bind_int(stmt, 6, data.armors);
- sqlite3_bind_int(stmt, 7, data.shields);
- sqlite3_bind_int(stmt, 8, data.armorpoints);
- sqlite3_bind_int(stmt, 9, data.shieldpoints);
- sqlite3_bind_int(stmt, 10, data.hitpoints);
- sqlite3_bind_int(stmt, 11, data.uid);
-
- rc = sqlite3_step(stmt);
- if(rc != SQLITE_DONE) {
- dolog("E: failed updating player=%d got error %s (%d)", data.uid, sqlite3_errmsg(db), rc);
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- md_exit(-1);
- }
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- }
- void main_menu() {
-
- int done = 0;
- char ch;
- while(!done) {
- md_clr_scr();
- if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) {
- md_sendfile("ansis/sc_mainh.ans", TRUE);
- ch = md_get_answer("PpLlVvQqEe\r");
- } else {
- md_sendfile("ansis/sc_mainl.ans", TRUE);
- ch = md_get_answer("PpLlVvQq\r");
- }
- md_clr_scr();
- switch(tolower(ch)){
- case 'q':
-
- md_printf("`bright white`Farewell!\r\n");
-
- done = 1;
- break;
- case '\r':
- case 'p':
-
- if (inuse == 1) {
- md_printf("`bright red`Game in use!\r\n");
- } else {
- md_printf("`bright white`Play\r\n");
- }
- paws();
- break;
- case 'l':
-
- md_printf("`bright red`There are no players!\r\n");
- paws();
- break;
- case 'v':
-
- md_clr_scr();
- md_printf("`bright yellow`|--------------------------|\r\n");
- md_printf("`bright yellow`| Space Construct v%d.%d-%s |\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_TYPE);
- md_printf("`bright yellow`|--------------------------|\r\n");
- paws();
- break;
- case 'e':
-
- if(mdcontrol.user_seclevel == 99 || mdcontrol.user_seclevel == 255) {
- md_printf("`bright green`Sysop Menu\r\n");
- paws();
- break;
- }
- }
- }
- }
- int main(int argc, char **argv) {
- int socket;
- if (argc < 2) {
- fprintf(stderr, "usage:\n%s (DROPFILE [SOCKET])\r\n", argv[0]);
- dolog("E %s (DROPFILE [SOCKET])", argv[0]);
- return 0;
- }
- if (argc > 2) {
- if (argv[2][0] >= '0' && argv[2][0] <= '9') {
- socket = strtol(argv[2], NULL, 10);
- } else {
- socket = -1;
- }
- } else {
- socket = -1;
- }
-
- md_init(argv[1], socket);
- md_clr_scr();
-
- if (debug) {
- dolog("=== Debug ===");
- md_printf("`white`=== Debug ===\r\n");
- md_printf("DropFile...\r\n");
- log_drop();
- int test = check_lock();
- if (test == 0) {
- md_printf("Lock is: Avalible\r\n");
- md_printf("Database...\r\n");
- db_test();
- } else {
- md_printf("Lock is: Taken\r\n");
- md_printf("CANCELED Database Dump\r\n");
- }
- md_printf("`bright green`Continue to Program?\r\n");
- md_printf("`bright black`(`bright white`Y`bright black`)`white`es `bright black`(`bright red`N`bright black`)`red`o");
- char t = md_get_answer("YyNn\r");
- md_printf("\r\n`white`");
- switch(tolower(t)) {
- case '\r':
- case 'y':
- break;
- case 'n':
- md_exit(0);
- break;
- }
- md_clr_scr();
- } else {
- dolog("--- Debug ---");
- }
-
- inuse = check_lock();
-
-
- if (inuse == 0) {
- grab_lock();
- }
-
-
- user_inf ply = load_player(locate_player(mdcontrol.user_firstname, mdcontrol.user_lastname));
- ply.experience += 10;
- update_player(ply);
-
- if (inuse == 0) {
- rel_lock();
- }
-
- md_exit(0);
- }
|