• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

密猟オンラインサーバープログラム


Commit MetaInfo

Revision6 (tree)
Time2016-01-26 17:47:18
Authormanjihq

Log Message

管理者用コマンドを実装
*ユーザー削除
*シャットダウン
*ユーザーアカウントのブロック/解除
*管理者のスコアおよびHPを回復
ユーザーアカウントのブロック状態を実装

Change Summary

Incremental Difference

--- trunk/huntserv.c (revision 5)
+++ trunk/huntserv.c (revision 6)
@@ -231,6 +231,12 @@
231231 unsigned long maybearrest;
232232 unsigned crime_level;
233233 unsigned arrest_count;
234+ enum account_t
235+ {
236+ AccountActive,
237+ AccountBlock
238+ }
239+ account_status;
234240 enum move_t
235241 {
236242 NoMove,
@@ -2190,6 +2196,7 @@
21902196 User[i].myshop[j].build = 0;
21912197 }
21922198 memset (User[i].password, 0, PASSWORD_LEN);
2199+ User[i].account_status = AccountActive;
21932200 User[i].session.handle = INVALID_SOCKET;
21942201 User[i].idletimer = 0;
21952202 User[i].hp = 0;
@@ -4798,7 +4805,7 @@
47984805 puts ("protocol mismatch.");
47994806 SendResultPacket (psession->handle, -1);
48004807 }
4801- else if (nuser != -1)
4808+ else if (nuser != -1 && User[nuser].account_status == AccountActive)
48024809 {
48034810 int i;
48044811 const unsigned char *p = packet + 2 + USERNAME_LEN;
@@ -4805,7 +4812,7 @@
48054812 char uname[USERNAME_LEN];
48064813 char work[PASSWORD_LEN];
48074814 memcpy (uname, User[nuser].name, USERNAME_LEN);
4808- printf ("User name:%-16.24s\n", uname);
4815+ printf ("User name:%-.24s\n", uname);
48094816 for (i = 0; i < PASSWORD_LEN; i++)
48104817 {
48114818 if (*(p + i) == '\0')
@@ -4883,7 +4890,14 @@
48834890 }
48844891 else
48854892 {
4886- puts ("no user.");
4893+ if (nuser == -1)
4894+ {
4895+ puts ("no user.");
4896+ }
4897+ else
4898+ {
4899+ printf ("Blocked User:%-.24s\n", User[nuser].name);
4900+ }
48874901 SendResultPacket (psession->handle, -1);
48884902 }
48894903 }
@@ -4984,49 +4998,6 @@
49844998 }
49854999 }
49865000 }
4987- else if (packet[0] == HCLIT_DELUSER)
4988- {
4989- int nuser = SearchUser ((char *) (packet + 2));
4990- puts ("attempt to delete.");
4991- if (nuser != -1)
4992- {
4993- int i;
4994- const unsigned char *p = packet + 2 + USERNAME_LEN;
4995- char uname[USERNAME_LEN];
4996- char work[PASSWORD_LEN];
4997- memcpy (uname, User[nuser].name, USERNAME_LEN);
4998- printf ("User name:%-16.24s\n", uname);
4999- for (i = 0; i < PASSWORD_LEN; i++)
5000- {
5001- if (*(p + i) == '\0')
5002- {
5003- break;
5004- }
5005- work[i] = *(p + i);
5006- }
5007- for (; i < PASSWORD_LEN; i++)
5008- {
5009- work[i] = ' ';
5010- }
5011- if (memcmp (User[nuser].password, work, PASSWORD_LEN) == 0)
5012- {
5013- /* ok. delete this user. */
5014- puts ("OK. delete this user.");
5015- DeleteUser (nuser);
5016- SendResultPacket (psession->handle, 0);
5017- }
5018- else
5019- {
5020- puts ("password mismatch.");
5021- SendResultPacket (psession->handle, -1);
5022- }
5023- }
5024- else
5025- {
5026- puts ("no user.");
5027- SendResultPacket (psession->handle, -1);
5028- }
5029- }
50305001 }
50315002 return ret;
50325003 }
@@ -5487,7 +5458,7 @@
54875458 {
54885459 char work[MESG_BUFFER];
54895460 unsigned n = ntohl (*(unsigned long *) (p + USERNAME_LEN));
5490- unsigned ntax = n / 100;
5461+ unsigned ntax = (nuser != 0) ? (n / 100) : 0;
54915462 if (User[nuser].score < n + ntax)
54925463 {
54935464 /* no score */
@@ -5528,6 +5499,64 @@
55285499 return;
55295500 }
55305501
5502+/* block or recover user account */
5503+static void
5504+doJailAccount (unsigned char *p)
5505+{
5506+ int ntarget = SearchUser ((char *) p);
5507+ if (ntarget != -1)
5508+ {
5509+ unsigned char action = *(p + USERNAME_LEN);
5510+ if (action)
5511+ {
5512+ /* block user account */
5513+ puts ("block user account");
5514+ printf ("User %d [%-.24s]\n", ntarget, User[ntarget].name);
5515+ DisconnectUser (ntarget);
5516+ User[ntarget].account_status = AccountBlock;
5517+ }
5518+ else
5519+ {
5520+ /* recover user account */
5521+ puts ("recover user account");
5522+ printf ("User %d [%-.24s]\n", ntarget, User[ntarget].name);
5523+ User[ntarget].account_status = AccountActive;
5524+ }
5525+ }
5526+ return;
5527+}
5528+
5529+/* execute admin command */
5530+static void
5531+doAdminCommand (unsigned char *p)
5532+{
5533+ unsigned n;
5534+ switch (*p)
5535+ {
5536+ case 1:
5537+ /* gain score */
5538+ n = ntohl (*(unsigned long *) (p + 1));
5539+ add_score (0, n);
5540+ break;
5541+ case 2:
5542+ /* gain HP */
5543+ n = ntohl (*(unsigned long *) (p + 1));
5544+ cause_heal (0, n);
5545+ default:
5546+ printf ("unknown admin command %02X\n", (unsigned) *p);
5547+ break;
5548+ }
5549+ return;
5550+}
5551+
5552+/* shutdown server */
5553+static void
5554+doShutDownServer (void)
5555+{
5556+ NowRunning = 0;
5557+ return;
5558+}
5559+
55315560 /* parse user command */
55325561 static void
55335562 parseCommand (int nuser, unsigned char *packet)
@@ -5689,9 +5718,59 @@
56895718 case HCLIT_TRANSFERSCORE:
56905719 doTransferScore (nuser, packet + 2);
56915720 break;
5721+ case HCLIT_DELUSER:
5722+ puts ("attempt to delete.");
5723+ if (nuser == 0)
5724+ {
5725+ /* for administrator */
5726+ int ntarget = SearchUser ((char *) (packet + 2));
5727+ if (ntarget != -1)
5728+ {
5729+ char uname[USERNAME_LEN];
5730+ memcpy (uname, User[nuser].name, USERNAME_LEN);
5731+ printf ("Delete User name:%-.24s\n", uname);
5732+ DeleteUser (nuser);
5733+ SendResultPacket (User[nuser].session.handle, 0);
5734+ }
5735+ else
5736+ {
5737+ puts ("no user.");
5738+ SendResultPacket (User[nuser].session.handle, -1);
5739+ }
5740+ }
5741+ else
5742+ {
5743+ printf ("User:%d [%-.24s] is cracking!\n", nuser, User[nuser].name);
5744+ SendResultPacket (User[nuser].session.handle, -1);
5745+ }
5746+ break;
56925747 case HCLIT_LOGOFF:
56935748 doLogoff (nuser);
56945749 break;
5750+ case HCLIT_JAILUSER:
5751+ if (nuser == 0)
5752+ {
5753+ /* for administrator */
5754+ /* block or recover user account */
5755+ doJailAccount (packet + 2);
5756+ }
5757+ break;
5758+ case HCLIT_ADMINCMD:
5759+ if (nuser == 0)
5760+ {
5761+ /* for administrator */
5762+ /* execute admin command */
5763+ doAdminCommand (packet + 2);
5764+ }
5765+ break;
5766+ case HCLIT_SHUTDOWN:
5767+ if (nuser == 0)
5768+ {
5769+ /* for administrator */
5770+ /* shutdown server */
5771+ doShutDownServer ();
5772+ }
5773+ break;
56955774 }
56965775 return;
56975776 }
--- trunk/hunt.h (revision 5)
+++ trunk/hunt.h (revision 6)
@@ -82,6 +82,9 @@
8282 #define HCLIT_LOGOFF 0x3a
8383 #define HCLIT_NEWUSER 0x3b
8484 #define HCLIT_DELUSER 0x3c
85+#define HCLIT_JAILUSER 0x3d
86+#define HCLIT_ADMINCMD 0x3e
87+#define HCLIT_SHUTDOWN 0x3f
8588
8689 /* map data */
8790 #define HCLIT_MAP_INVALID '?'