Browse Source

Updated the eol style

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1271 54d463be-8e91-2dee-dedb-b68131a5f0ec
amber 20 năm trước cách đây
mục cha
commit
6ffce0caf6

+ 54 - 54
conf-tmpl/packet_athena.conf

@@ -1,55 +1,55 @@
-// Athena sockets Configuration file
-// (Untranslated yet)
-
-
-// デバッグ情報の表示(バグ報告の際にコピペして頂けると助かります)
-debug: no
-
-// How long can a socket stall before closing the connection (in seconds)
-stall_time: 60
-
-
-//----- IP Rules Settings -----
-
-// Do we check IP's before allowing incoming connections?
-enable_ip_rules: yes
-
-// アクセス制限の判定順序(Apacheと同じ)
-// deny,allow が標準になっています。
-
-order: deny,allow
-// order: allow,deny
-// order: mutual-failture
-
-// アクセスコントロールするIPリスト
-//   allow    : ddosチェックの結果に関係なく許可
-//   deny     : 不許可
-//   指定無し : ddosチェックの結果で許可 / 不許可を決定
-//              ただし、mutual-failture の場合は不許可になります。
-
-// allow: 127.0.0.1
-// allow: 192.168.0.0/16
-// allow: 10.0.0.0/255.0.0.0
-allow: all
-
-// deny: 127.0.0.1
-
-
-//---- Ddos Protection Settings ----
-
-// ddos攻撃と判断する為のルール設定
-//     ddos_interval msec以内の接続要求がddos_count回続いた場合に、
-//     ddos攻撃されたと判定します。
-
-// 接続間隔(msec)
-ddos_interval: 3000
-
-// 接続回数
-ddos_count: 5
-
-// ddos制限を解除する間隔(msec)
-//     この時間経過すると、接続制限が解除されます。
-ddos_autoreset: 600000
-
-
+// Athena sockets Configuration file
+// (Untranslated yet)
+
+
+// デバッグ情報の表示(バグ報告の際にコピペして頂けると助かります)
+debug: no
+
+// How long can a socket stall before closing the connection (in seconds)
+stall_time: 60
+
+
+//----- IP Rules Settings -----
+
+// Do we check IP's before allowing incoming connections?
+enable_ip_rules: yes
+
+// アクセス制限の判定順序(Apacheと同じ)
+// deny,allow が標準になっています。
+
+order: deny,allow
+// order: allow,deny
+// order: mutual-failture
+
+// アクセスコントロールするIPリスト
+//   allow    : ddosチェックの結果に関係なく許可
+//   deny     : 不許可
+//   指定無し : ddosチェックの結果で許可 / 不許可を決定
+//              ただし、mutual-failture の場合は不許可になります。
+
+// allow: 127.0.0.1
+// allow: 192.168.0.0/16
+// allow: 10.0.0.0/255.0.0.0
+allow: all
+
+// deny: 127.0.0.1
+
+
+//---- Ddos Protection Settings ----
+
+// ddos攻撃と判断する為のルール設定
+//     ddos_interval msec以内の接続要求がddos_count回続いた場合に、
+//     ddos攻撃されたと判定します。
+
+// 接続間隔(msec)
+ddos_interval: 3000
+
+// 接続回数
+ddos_count: 5
+
+// ddos制限を解除する間隔(msec)
+//     この時間経過すると、接続制限が解除されます。
+ddos_autoreset: 600000
+
+
 //import: conf/import/packet_conf.txt

+ 110 - 110
npc/warps/einbroch.txt

@@ -1,111 +1,111 @@
-//Einbroch and Einbech warps by Sara - Semi-final 2
-//Einbroch Field <-> Juno Field
-yuno_fild04.gat,251,21,0	warp	ein001	1,1,ein_fild06.gat,252,363
-ein_fild06.gat,252,365,0	warp	ein001a	1,1,yuno_fild04.gat,251,23
-yuno_fild07.gat,73,219,0	warp	ein002	1,1,ein_fild06.gat,338,170
-ein_fild06.gat,340,170,0	warp	ein002a	1,1,yuno_fild07.gat,75,219
-yuno_fild07.gat,56,76,0	warp	ein003	1,1,ein_fild06.gat,354,94
-ein_fild06.gat,356,94,0	warp	ein003a	1,1,yuno_fild07.gat,58,76
-yuno_fild11.gat,28,266,0	warp	ein004	1,1,ein_fild07.gat,380,263
-ein_fild07.gat,382,263,0	warp	ein004a	1,1,yuno_fild11.gat,30,266
-
-//Einbroch Field
-ein_fild06.gat,135,35,0	warp	ein005	1,1,ein_fild07.gat,147,360
-ein_fild07.gat,145,362,0	warp	ein005a	1,1,ein_fild07.gat,135,37
-ein_fild07.gat,191,42,0	warp	ein006	1,1,ein_fild10.gat,194,370
-ein_fild10.gat,194,372,0	warp	ein006a	1,1,ein_fild07.gat,191,44
-ein_fild10.gat,24,331,0	warp	ein007	1,1,ein_fild09.gat,327,346
-ein_fild09.gat,329,346,0	warp	ein007a	1,1,ein_fild10.gat,26,331
-ein_fild09.gat,34,132,0	warp	ein008	1,1,ein_fild08.gat,361,128
-ein_fild08.gat,363,128,0	warp	ein008a	1,1,ein_fild09.gat,36,132
-
-//Einbroch Field <-> Einbroch and Einbech
-ein_fild08.gat,164,381,0	warp	ein009	1,1,einbroch.gat,150,26
-einbroch.gat,150,24,0	warp	ein009a	1,1,ein_fild08.gat,164,379
-ein_fild09.gat,70,353,0	warp	ein010	1,1,einbech.gat,62,31
-einbech.gat,62,29,0	warp	ein010a	1,1,ein_fild09.gat,72,353
-
-//Dungeon Warps
-einbech.gat,139,253,0	warp	ein011	1,1,ein_dun01.gat,22,17
-ein_dun01.gat,22,15,0	warp	ein011a	1,1,einbech.gat,139,251
-ein_dun01.gat,262,256,0	warp	ein012	1,1,ein_dun02.gat,292,290
-ein_dun02.gat,292,292,0	warp	ein012a	1,1,ein_dun01.gat,262,258
-
-//Inside Warps
-ein_in01.gat,13,213,0	warp	ein013	1,1,einbroch.gat,131,80
-einbroch.gat,133,80,0	warp	ein013a	1,1,ein_in01.gat,15,213
-ein_in01.gat,110,267,0	warp	ein014	1,1,einbroch.gat,204,120
-einbroch.gat,202,120,0	warp	ein014a	1,1,ein_in01.gat,108,267
-ein_in01.gat,110,236,0	warp	ein015	1,1,einbroch.gat,204,100
-einbroch.gat,202,100,0	warp	ein015a	1,1,ein_in01.gat,108,236
-ein_in01.gat,80,199,0	warp	ein016	1,1,einbroch.gat,178,71
-einbroch.gat,178,73,0	warp	ein016a	1,1,ein_in01.gat,80,201
-ein_in01.gat,195,224,0	warp	ein017	1,1,einbroch.gat,255,200
-einbroch.gat,257,200,0	warp	ein017a	1,1,ein_in01.gat,197,224
-ein_in01.gat,211,232,0	warp	ein018	1,1,ein_in01.gat,273,232
-ein_in01.gat,271,232,0	warp	ein018a	1,1,ein_in01.gat,209,232
-ein_in01.gat,211,216,0	warp	ein019	1,1,ein_in01.gat,273,218
-ein_in01.gat,271,218,0	warp	ein019a	1,1,ein_in01.gat,209,216
-ein_in01.gat,181,277,0	warp	ein020	1,1,ein_in01.gat,281,224
-ein_in01.gat,283,224,0	warp	ein020a	1,1,ein_in01.gat,179,277
-ein_in01.gat,232,273,0	warp	ein021	1,1,ein_in01.gat,274,244
-ein_in01.gat,274,246,0	warp	ein021a	1,1,ein_in01.gat,232,275
-ein_in01.gat,273,273,0	warp	ein022	1,1,ein_in01.gat,264,244
-ein_in01.gat,264,246,0	warp	ein022a	1,1,ein_in01.gat,273,275
-ein_in01.gat,232,176,0	warp	ein023	1,1,ein_in01.gat,264,205
-ein_in01.gat,264,203,0	warp	ein023a	1,1,ein_in01.gat,232,174
-ein_in01.gat,274,176,0	warp	ein024	1,1,ein_in01.gat,274,205
-ein_in01.gat,274,203,0	warp	ein024a	1,1,ein_in01.gat,274,174
-
-//House with couches
-//- Bottom-left doorway
-//ein_in01.gat,11,147,0	warp	ein025	1,1,mapname.gat,x,y
-//mapname.gat,x,y,0	warp	ein025a	1,1,ein_in01.gat,13,147
-//- Top-right doorway
-//ein_in01.gat,26,131,0	warp	ein026	1,1,mapname.gat,x,y
-//mapname.gat,x,y,0	warp	ein026a	1,1,ein_in01.gat,26,133
-
-ein_in01.gat,145,152,0	warp	ein027	1,1,einbech.gat,253,110
-einbech.gat,255,110,0	warp	ein027a	1,1,ein_in01.gat,147,152
-ein_in01.gat,39,85,0	warp	ein028	1,1,ein_in01.gat,37,36
-ein_in01.gat,39,36,0	warp	ein028a	1,1,ein_in01.gat,37,85
-ein_in01.gat,14,13,0	warp	ein029	1,1,einbroch.gat,255,109
-einbroch.gat,255,107,0	warp	ein029a	1,1,ein_in01.gat,14,15
-
-//2 floor laboratory-ish house
-//- Left Exit
-//ein_in01.gat,103,95,0	warp	ein030	1,1,mapname.gat,x,y
-//mapname.gat,x,y,0	warp	ein030a	1,1,ein_in01.gat,105,95
-//- Right Exit
-//ein_in01.gat,120,77,0	warp	ein031	1,1,mapname.gat,x,y
-//mapname.gat,x,y,0	warp	ein031a	1,1,ein_in01.gat,120,79
-//- Elevator
-ein_in01.gat,126,88,0	warp	ein032	1,1,ein_in01.gat,100,140
-ein_in01.gat,100,142,0	warp	ein032a	1,1,ein_in01.gat,126,86
-
-//House
-//- Bottom-left doorway
-//ein_in01.gat,187,98,0	warp	ein033	1,1,mapname.gat,x,y
-//mapname.gat,x,y,0	warp	ein033a	1,1,ein_in01.gat,189,98
-//- Top-right doorway
-//ein_in01.gat,204,81,0	warp	ein034	1,1,mapname.gat,x,y
-//mapname.gat,x,y,0	warp	ein034a	1,1,ein_in01.gat,204,83
-
-ein_in01.gat,265,105,0	warp	ein035	1,1,einbech.gat,143,112
-einbech.gat,145,112,0	warp	ein035a	1,1,ein_in01.gat,267,105
-ein_in01.gat,288,89,0	warp	ein036	1,1,einbech.gat,155,106
-einbech.gat,153,106,0	warp	ein036a	1,1,ein_in01.gat,286,89
-ein_in01.gat,108,13,0	warp	ein037	1,1,einbroch.gat,217,212
-einbroch.gat,217,214,0	warp	ein037a	1,1,ein_in01.gat,108,15
-ein_in01.gat,200,32,0	warp	ein038	1,1,einbech.gat,170,144
-einbech.gat,170,146,0	warp	ein038a	1,1,ein_in01.gat,200,30
-ein_in01.gat,189,37,0	warp	ein039	1,1,einbech.gat,177,136
-einbech.gat,177,138,0	warp	ein039a	1,1,ein_in01.gat,189,35
-ein_in01.gat,288,25,0	warp	ein040	1,1,einbroch.gat,52,52
-einbroch.gat,50,52,0	warp	ein040a	1,1,ein_in01.gat,286,25
-airport.gat,125,14,0	warp	ein041	1,1,airport.gat,19,20
-airport.gat,19,18,0	warp	ein041a	1,1,airport.gat,123,14
-airport.gat,160,14,0	warp	ein042	1,1,airport.gat,48,20
-airport.gat,48,18,0	warp	ein042a	1,1,airport.gat,162,14
-einbroch.gat,64,208,0	warp	ein043	1,1,airport.gat,143,15
+//Einbroch and Einbech warps by Sara - Semi-final 2
+//Einbroch Field <-> Juno Field
+yuno_fild04.gat,251,21,0	warp	ein001	1,1,ein_fild06.gat,252,363
+ein_fild06.gat,252,365,0	warp	ein001a	1,1,yuno_fild04.gat,251,23
+yuno_fild07.gat,73,219,0	warp	ein002	1,1,ein_fild06.gat,338,170
+ein_fild06.gat,340,170,0	warp	ein002a	1,1,yuno_fild07.gat,75,219
+yuno_fild07.gat,56,76,0	warp	ein003	1,1,ein_fild06.gat,354,94
+ein_fild06.gat,356,94,0	warp	ein003a	1,1,yuno_fild07.gat,58,76
+yuno_fild11.gat,28,266,0	warp	ein004	1,1,ein_fild07.gat,380,263
+ein_fild07.gat,382,263,0	warp	ein004a	1,1,yuno_fild11.gat,30,266
+
+//Einbroch Field
+ein_fild06.gat,135,35,0	warp	ein005	1,1,ein_fild07.gat,147,360
+ein_fild07.gat,145,362,0	warp	ein005a	1,1,ein_fild07.gat,135,37
+ein_fild07.gat,191,42,0	warp	ein006	1,1,ein_fild10.gat,194,370
+ein_fild10.gat,194,372,0	warp	ein006a	1,1,ein_fild07.gat,191,44
+ein_fild10.gat,24,331,0	warp	ein007	1,1,ein_fild09.gat,327,346
+ein_fild09.gat,329,346,0	warp	ein007a	1,1,ein_fild10.gat,26,331
+ein_fild09.gat,34,132,0	warp	ein008	1,1,ein_fild08.gat,361,128
+ein_fild08.gat,363,128,0	warp	ein008a	1,1,ein_fild09.gat,36,132
+
+//Einbroch Field <-> Einbroch and Einbech
+ein_fild08.gat,164,381,0	warp	ein009	1,1,einbroch.gat,150,26
+einbroch.gat,150,24,0	warp	ein009a	1,1,ein_fild08.gat,164,379
+ein_fild09.gat,70,353,0	warp	ein010	1,1,einbech.gat,62,31
+einbech.gat,62,29,0	warp	ein010a	1,1,ein_fild09.gat,72,353
+
+//Dungeon Warps
+einbech.gat,139,253,0	warp	ein011	1,1,ein_dun01.gat,22,17
+ein_dun01.gat,22,15,0	warp	ein011a	1,1,einbech.gat,139,251
+ein_dun01.gat,262,256,0	warp	ein012	1,1,ein_dun02.gat,292,290
+ein_dun02.gat,292,292,0	warp	ein012a	1,1,ein_dun01.gat,262,258
+
+//Inside Warps
+ein_in01.gat,13,213,0	warp	ein013	1,1,einbroch.gat,131,80
+einbroch.gat,133,80,0	warp	ein013a	1,1,ein_in01.gat,15,213
+ein_in01.gat,110,267,0	warp	ein014	1,1,einbroch.gat,204,120
+einbroch.gat,202,120,0	warp	ein014a	1,1,ein_in01.gat,108,267
+ein_in01.gat,110,236,0	warp	ein015	1,1,einbroch.gat,204,100
+einbroch.gat,202,100,0	warp	ein015a	1,1,ein_in01.gat,108,236
+ein_in01.gat,80,199,0	warp	ein016	1,1,einbroch.gat,178,71
+einbroch.gat,178,73,0	warp	ein016a	1,1,ein_in01.gat,80,201
+ein_in01.gat,195,224,0	warp	ein017	1,1,einbroch.gat,255,200
+einbroch.gat,257,200,0	warp	ein017a	1,1,ein_in01.gat,197,224
+ein_in01.gat,211,232,0	warp	ein018	1,1,ein_in01.gat,273,232
+ein_in01.gat,271,232,0	warp	ein018a	1,1,ein_in01.gat,209,232
+ein_in01.gat,211,216,0	warp	ein019	1,1,ein_in01.gat,273,218
+ein_in01.gat,271,218,0	warp	ein019a	1,1,ein_in01.gat,209,216
+ein_in01.gat,181,277,0	warp	ein020	1,1,ein_in01.gat,281,224
+ein_in01.gat,283,224,0	warp	ein020a	1,1,ein_in01.gat,179,277
+ein_in01.gat,232,273,0	warp	ein021	1,1,ein_in01.gat,274,244
+ein_in01.gat,274,246,0	warp	ein021a	1,1,ein_in01.gat,232,275
+ein_in01.gat,273,273,0	warp	ein022	1,1,ein_in01.gat,264,244
+ein_in01.gat,264,246,0	warp	ein022a	1,1,ein_in01.gat,273,275
+ein_in01.gat,232,176,0	warp	ein023	1,1,ein_in01.gat,264,205
+ein_in01.gat,264,203,0	warp	ein023a	1,1,ein_in01.gat,232,174
+ein_in01.gat,274,176,0	warp	ein024	1,1,ein_in01.gat,274,205
+ein_in01.gat,274,203,0	warp	ein024a	1,1,ein_in01.gat,274,174
+
+//House with couches
+//- Bottom-left doorway
+//ein_in01.gat,11,147,0	warp	ein025	1,1,mapname.gat,x,y
+//mapname.gat,x,y,0	warp	ein025a	1,1,ein_in01.gat,13,147
+//- Top-right doorway
+//ein_in01.gat,26,131,0	warp	ein026	1,1,mapname.gat,x,y
+//mapname.gat,x,y,0	warp	ein026a	1,1,ein_in01.gat,26,133
+
+ein_in01.gat,145,152,0	warp	ein027	1,1,einbech.gat,253,110
+einbech.gat,255,110,0	warp	ein027a	1,1,ein_in01.gat,147,152
+ein_in01.gat,39,85,0	warp	ein028	1,1,ein_in01.gat,37,36
+ein_in01.gat,39,36,0	warp	ein028a	1,1,ein_in01.gat,37,85
+ein_in01.gat,14,13,0	warp	ein029	1,1,einbroch.gat,255,109
+einbroch.gat,255,107,0	warp	ein029a	1,1,ein_in01.gat,14,15
+
+//2 floor laboratory-ish house
+//- Left Exit
+//ein_in01.gat,103,95,0	warp	ein030	1,1,mapname.gat,x,y
+//mapname.gat,x,y,0	warp	ein030a	1,1,ein_in01.gat,105,95
+//- Right Exit
+//ein_in01.gat,120,77,0	warp	ein031	1,1,mapname.gat,x,y
+//mapname.gat,x,y,0	warp	ein031a	1,1,ein_in01.gat,120,79
+//- Elevator
+ein_in01.gat,126,88,0	warp	ein032	1,1,ein_in01.gat,100,140
+ein_in01.gat,100,142,0	warp	ein032a	1,1,ein_in01.gat,126,86
+
+//House
+//- Bottom-left doorway
+//ein_in01.gat,187,98,0	warp	ein033	1,1,mapname.gat,x,y
+//mapname.gat,x,y,0	warp	ein033a	1,1,ein_in01.gat,189,98
+//- Top-right doorway
+//ein_in01.gat,204,81,0	warp	ein034	1,1,mapname.gat,x,y
+//mapname.gat,x,y,0	warp	ein034a	1,1,ein_in01.gat,204,83
+
+ein_in01.gat,265,105,0	warp	ein035	1,1,einbech.gat,143,112
+einbech.gat,145,112,0	warp	ein035a	1,1,ein_in01.gat,267,105
+ein_in01.gat,288,89,0	warp	ein036	1,1,einbech.gat,155,106
+einbech.gat,153,106,0	warp	ein036a	1,1,ein_in01.gat,286,89
+ein_in01.gat,108,13,0	warp	ein037	1,1,einbroch.gat,217,212
+einbroch.gat,217,214,0	warp	ein037a	1,1,ein_in01.gat,108,15
+ein_in01.gat,200,32,0	warp	ein038	1,1,einbech.gat,170,144
+einbech.gat,170,146,0	warp	ein038a	1,1,ein_in01.gat,200,30
+ein_in01.gat,189,37,0	warp	ein039	1,1,einbech.gat,177,136
+einbech.gat,177,138,0	warp	ein039a	1,1,ein_in01.gat,189,35
+ein_in01.gat,288,25,0	warp	ein040	1,1,einbroch.gat,52,52
+einbroch.gat,50,52,0	warp	ein040a	1,1,ein_in01.gat,286,25
+airport.gat,125,14,0	warp	ein041	1,1,airport.gat,19,20
+airport.gat,19,18,0	warp	ein041a	1,1,airport.gat,123,14
+airport.gat,160,14,0	warp	ein042	1,1,airport.gat,48,20
+airport.gat,48,18,0	warp	ein042a	1,1,airport.gat,162,14
+einbroch.gat,64,208,0	warp	ein043	1,1,airport.gat,143,15
 airport.gat,143,13,0	warp	ein043a	1,1,einbroch.gat,64,206

+ 6 - 6
src/tool/Makefile

@@ -1,6 +1,6 @@
-all:
-	$(CC) -o adduser adduser.c
-
-clean:
-	rm -f adduser
-	rm -f *.exe
+all:
+	$(CC) -o adduser adduser.c
+
+clean:
+	rm -f adduser
+	rm -f *.exe

+ 96 - 96
src/tool/adduser.c

@@ -1,96 +1,96 @@
-/*
-	This program adds an user to account.txt
-	Don't usr it When login-sever is working.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-char *account_txt = "../save/account.txt";
-
-//-----------------------------------------------------
-// Function to suppress control characters in a string.
-//-----------------------------------------------------
-int remove_control_chars(unsigned char *str) {
-	int i;
-	int change = 0;
-
-	for(i = 0; str[i]; i++) {
-		if (str[i] < 32) {
-			str[i] = '_';
-			change = 1;
-		}
-	}
-
-	return change;
-}
-
-int main(int argc, char *argv[]) {
-
-	char username[24];
-	char password[24];
-	char sex[2];
-
-	int next_id, id;
-	char line[1024];
-
-	// Check to see if account.txt exists.
-	printf("Checking if '%s' file exists...\n", account_txt);
-	FILE *FPaccin = fopen(account_txt, "r");
-	if (FPaccin == NULL) {
-		printf("'%s' file not found!\n", account_txt);
-		printf("Run the setup wizard please.\n");
-		exit(0);
-	}
-
-	next_id = 2000000;
-	while(fgets(line, sizeof(line)-1, FPaccin)) {
-		if (line[0] == '/' && line[1] == '/') { continue; }
-		if (sscanf(line, "%d\t%%newid%%\n", &id) == 1) {
-			if (next_id < id) {
-				next_id = id;
-			}
-		} else {
-			sscanf(line,"%i%[^	]", &id);
-			if (next_id <= id) {
-				next_id = id +1;
-			}
-		}
-	}
-	close(FPaccin);
-	printf("File exists.\n");
-
-	printf("Don't create an account if the login-server is online!!!\n");
-	printf("If the login-server is online, press ctrl+C now to stop this software.\n");
-	printf("\n");
-
-	strcpy(username, "");
-	while (strlen(username) < 4 || strlen(username) > 23) {
-		printf("Enter an username (4-23 characters): ");
-		scanf("%s", &username);
-		username[23] = 0;
-		remove_control_chars(username);
-	}
-
-	strcpy(password, "");
-	while (strlen(password) < 4 || strlen(password) > 23) {
-		printf("Enter a password (4-23 characters): ");
-		scanf("%s", &password);
-		password[23] = 0;
-		remove_control_chars(password);
-	}
-
-	strcpy(sex, "");
-	while (strcmp(sex, "F") != 0 && strcmp(sex, "M") != 0) {
-		printf("Enter a gender (M for male, F for female): ");
-		scanf("%s", &sex);
-	}
-
-	FILE *FPaccout = fopen(account_txt, "r+");
-	fseek(FPaccout, 0, SEEK_END);
-	fprintf(FPaccout, "%i	%s	%s	-	%s	-\r\n", next_id, username, password, sex);
-	close(FPaccout);
-
-	printf("Account added.\n");
-}
+/*
+	This program adds an user to account.txt
+	Don't usr it When login-sever is working.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *account_txt = "../save/account.txt";
+
+//-----------------------------------------------------
+// Function to suppress control characters in a string.
+//-----------------------------------------------------
+int remove_control_chars(unsigned char *str) {
+	int i;
+	int change = 0;
+
+	for(i = 0; str[i]; i++) {
+		if (str[i] < 32) {
+			str[i] = '_';
+			change = 1;
+		}
+	}
+
+	return change;
+}
+
+int main(int argc, char *argv[]) {
+
+	char username[24];
+	char password[24];
+	char sex[2];
+
+	int next_id, id;
+	char line[1024];
+
+	// Check to see if account.txt exists.
+	printf("Checking if '%s' file exists...\n", account_txt);
+	FILE *FPaccin = fopen(account_txt, "r");
+	if (FPaccin == NULL) {
+		printf("'%s' file not found!\n", account_txt);
+		printf("Run the setup wizard please.\n");
+		exit(0);
+	}
+
+	next_id = 2000000;
+	while(fgets(line, sizeof(line)-1, FPaccin)) {
+		if (line[0] == '/' && line[1] == '/') { continue; }
+		if (sscanf(line, "%d\t%%newid%%\n", &id) == 1) {
+			if (next_id < id) {
+				next_id = id;
+			}
+		} else {
+			sscanf(line,"%i%[^	]", &id);
+			if (next_id <= id) {
+				next_id = id +1;
+			}
+		}
+	}
+	close(FPaccin);
+	printf("File exists.\n");
+
+	printf("Don't create an account if the login-server is online!!!\n");
+	printf("If the login-server is online, press ctrl+C now to stop this software.\n");
+	printf("\n");
+
+	strcpy(username, "");
+	while (strlen(username) < 4 || strlen(username) > 23) {
+		printf("Enter an username (4-23 characters): ");
+		scanf("%s", &username);
+		username[23] = 0;
+		remove_control_chars(username);
+	}
+
+	strcpy(password, "");
+	while (strlen(password) < 4 || strlen(password) > 23) {
+		printf("Enter a password (4-23 characters): ");
+		scanf("%s", &password);
+		password[23] = 0;
+		remove_control_chars(password);
+	}
+
+	strcpy(sex, "");
+	while (strcmp(sex, "F") != 0 && strcmp(sex, "M") != 0) {
+		printf("Enter a gender (M for male, F for female): ");
+		scanf("%s", &sex);
+	}
+
+	FILE *FPaccout = fopen(account_txt, "r+");
+	fseek(FPaccout, 0, SEEK_END);
+	fprintf(FPaccout, "%i	%s	%s	-	%s	-\r\n", next_id, username, password, sex);
+	close(FPaccout);
+
+	printf("Account added.\n");
+}

+ 100 - 100
src/tool/backup

@@ -1,100 +1,100 @@
-#!/usr/bin/perl
-
-##########################################################################
-# Athena用データバックアップツール
-#
-#  Athenaの各種データファイル*.txtをバックアップするツール
-#
-#-------------------------------------------------------------------------
-# 設定方法
-#  実行する時のカレントフォルダからのデータへのパス、ファイルのリストを
-#  正しく設定します。バックアップ先のフォルダは自動作成されないので、
-#  自分で作成しておく必要があります。
-#  フォルダの最後の「/」は省略できません。
-#
-#  フォルダは引数でも指定できます。例>./backup ../save/ ./backup_data/
-#  フォルダの最後の「/」は省略できません。
-#
-#  実行するとバックアップ先のフォルダへ、ファイル名に現在の日付と時刻を
-#  つけてファイルをコピーします。
-#
-#   * toolフォルダ内にbackup_dataフォルダを作成し、
-#    athena.shの中に「./tool/backup ./save/ ./tool/backup_data/」
-#     という行を追加すると、athenaを起動するたびにバックアップが取れます
-#
-#   復元するときは引数に「-r 日付と時刻」を指定します。
-#  またその後ろにフォルダを指定することも出来ます
-#  例1> ./backup -r 200309191607
-#  例2> ./backup -r 200309191607 ../save ./backup_data/
-#  この例では2003/09/19の16:07分にバックアップしたデータを復元しています
-#
-#  復元するとき、Athenaディレクトリにあるデータは *.bak に名前を変更して
-#  残しているので、いらない場合は rm *.bak などで消してください。
-#
-##########################################################################
-
-$sdir="../save/";		#バックアップ元(Athenaのディレクトリ/save/)
-$tdir="./backup_data/";		#バックアップ先
-
-@files=(			#ファイルのリスト
-	"account","athena","storage","party","guild","castle","pet"
-);
-
-
-#-------------------------------設定ここまで-----------------------------
-
-
-
-
-
-
-
-
-
-
-
-if($ARGV[0]=~/^\-r$/i || $ARGV[0]=~/\-\-(recover|restore)/i){
-	#復元処理
-
-	$file=$ARGV[1];
-	$sdir=$ARGV[2]||$sdir;
-	$tdir=$ARGV[3]||$tdir;
-	&restorecopy($_) foreach @files;
-	exit(0);
-}
-
-#バックアップ処理
-$sdir=$ARGV[0]||$sdir;
-$tdir=$ARGV[1]||$tdir;
-
-unless( -d $tdir ){
-	print "$0: \"$tdir\" : No such directory\n";
-	exit(1);
-}
-
-(undef,$min,$hour,$day,$month,$year)=localtime;
-
-$file=sprintf("%04d%02d%02d%02d%02d",
-	$year+1900, $month+1, $day, $hour, $min );
-
-&backupcopy($_) foreach @files;
-exit(0);
-
-sub backupcopy {
-	my($name)= @_;
-	system("cp $sdir$name.txt $tdir$name$file.txt");
-}
-
-sub restorecopy {
-	my($name)= @_;
-	unless( -f "$sdir$name.txt" ){
-		printf("$0: \"$sdir$name.txt\" not found!\n");
-		return 0;
-	}
-	unless( -f "$tdir$name$file.txt" ){
-		printf("$0: \"$tdir$name$file.txt\" not found!\n");
-		return 0;
-	}
-	rename "$sdir$name.txt","$sdir$name.bak";
-	system("cp $tdir$name$file.txt $sdir$name.txt");
-}
+#!/usr/bin/perl
+
+##########################################################################
+# Athena用データバックアップツール
+#
+#  Athenaの各種データファイル*.txtをバックアップするツール
+#
+#-------------------------------------------------------------------------
+# 設定方法
+#  実行する時のカレントフォルダからのデータへのパス、ファイルのリストを
+#  正しく設定します。バックアップ先のフォルダは自動作成されないので、
+#  自分で作成しておく必要があります。
+#  フォルダの最後の「/」は省略できません。
+#
+#  フォルダは引数でも指定できます。例>./backup ../save/ ./backup_data/
+#  フォルダの最後の「/」は省略できません。
+#
+#  実行するとバックアップ先のフォルダへ、ファイル名に現在の日付と時刻を
+#  つけてファイルをコピーします。
+#
+#   * toolフォルダ内にbackup_dataフォルダを作成し、
+#    athena.shの中に「./tool/backup ./save/ ./tool/backup_data/」
+#     という行を追加すると、athenaを起動するたびにバックアップが取れます
+#
+#   復元するときは引数に「-r 日付と時刻」を指定します。
+#  またその後ろにフォルダを指定することも出来ます
+#  例1> ./backup -r 200309191607
+#  例2> ./backup -r 200309191607 ../save ./backup_data/
+#  この例では2003/09/19の16:07分にバックアップしたデータを復元しています
+#
+#  復元するとき、Athenaディレクトリにあるデータは *.bak に名前を変更して
+#  残しているので、いらない場合は rm *.bak などで消してください。
+#
+##########################################################################
+
+$sdir="../save/";		#バックアップ元(Athenaのディレクトリ/save/)
+$tdir="./backup_data/";		#バックアップ先
+
+@files=(			#ファイルのリスト
+	"account","athena","storage","party","guild","castle","pet"
+);
+
+
+#-------------------------------設定ここまで-----------------------------
+
+
+
+
+
+
+
+
+
+
+
+if($ARGV[0]=~/^\-r$/i || $ARGV[0]=~/\-\-(recover|restore)/i){
+	#復元処理
+
+	$file=$ARGV[1];
+	$sdir=$ARGV[2]||$sdir;
+	$tdir=$ARGV[3]||$tdir;
+	&restorecopy($_) foreach @files;
+	exit(0);
+}
+
+#バックアップ処理
+$sdir=$ARGV[0]||$sdir;
+$tdir=$ARGV[1]||$tdir;
+
+unless( -d $tdir ){
+	print "$0: \"$tdir\" : No such directory\n";
+	exit(1);
+}
+
+(undef,$min,$hour,$day,$month,$year)=localtime;
+
+$file=sprintf("%04d%02d%02d%02d%02d",
+	$year+1900, $month+1, $day, $hour, $min );
+
+&backupcopy($_) foreach @files;
+exit(0);
+
+sub backupcopy {
+	my($name)= @_;
+	system("cp $sdir$name.txt $tdir$name$file.txt");
+}
+
+sub restorecopy {
+	my($name)= @_;
+	unless( -f "$sdir$name.txt" ){
+		printf("$0: \"$sdir$name.txt\" not found!\n");
+		return 0;
+	}
+	unless( -f "$tdir$name$file.txt" ){
+		printf("$0: \"$tdir$name$file.txt\" not found!\n");
+		return 0;
+	}
+	rename "$sdir$name.txt","$sdir$name.bak";
+	system("cp $tdir$name$file.txt $sdir$name.txt");
+}

+ 204 - 204
src/tool/cgi/addaccount.cgi

@@ -1,204 +1,204 @@
-#!/usr/bin/perl
-
-#=========================================================================
-# addaccount.cgi  ver.1.00
-#	ladminをラップした、アカウントを作成するCGI。
-#	ladmin ver.1.04での動作を確認。
-#
-# ** 設定方法 **
-#
-# - 下の$ladmin変数にladminへのパスを設定すること。
-# - UNIX系OSで使用する場合はladminと共に改行コードを変換すること、また
-#   ファイル先頭行をperlの正しいパスにすること。例> $ which perl
-# - サーバープログラムやブラウザによっては $cgiuri にこのファイルへの
-#   完全なURIをセットしなければならない場合もある。
-# - perlにパスが通っていない場合は $perl をperlへの正しいパスにすること。
-# - 他は普通のCGIと同じです。(実行権やcgi-binフォルダなど)
-#
-# ** その他 **
-#   addaccount.cgi をブラウザで開くとサンプルHTML(そのまま使えます)が
-#   開きます。また、このcgiはブラウザから送られるAccept-Languageが
-#   jaで始まっていればメッセージの一部を日本語に変換します。
-#   (IEならインターネットオプションの言語設定で一番上に日本語を置く)
-#	それ以外の場合は英語のまま出力します。
-#-------------------------------------------------------------------------
-
-my($ladmin)	= "../ladmin";			# ladminのパス(おそらく変更が必要)
-
-my($cgiuri)	= "./addaccount.cgi";	# このファイルのURI
-my($perl)	= "perl";				# perlのコマンド名
-
-
-
-#--------------------------- 設定ここまで --------------------------------
-
-
-
-
-
-
-use strict;
-use CGI;
-
-my($cgi)= new CGI;
-my(%langconv)=(
-	'Athena login-server administration tool.*' => '',
-	'logged on.*' => '',
-);
-
-# ----- 日本語環境なら変換テーブルをセット -----
-if($ENV{'HTTP_ACCEPT_LANGUAGE'}=~/^ja/){
-	my(%tmp)=(
-		'Account \[(.+)\] is successfully created.*'
-			=> 'アカウント "$1" を作成しました.',
-		'Account \[(.+)\] creation failed\. same account exists.*'
-			=> 'アカウント "$1" は既に存在します.',
-		'Illeagal charactor found in UserID.*'
-			=> 'IDの中に不正な文字があります.',
-		'Illeagal charactor found in Password.*'
-			=> 'Passwordの中に不正な文字があります.',
-		'input UserID 4-24 bytes.'
-			=> 'IDは半角4~24文字で入力してください.',
-		'input Password 4-24 bytes.'
-			=> 'Passwordは半角4~24文字で入力してください.',
-		'Illeagal gender.*'
-			=> '性別がおかしいです.',
-		'Cant connect to login server.*'
-			=> 'ログインサーバーに接続できません.',
-		'login error.*'
-			=> 'ログインサーバーへの管理者権限ログインに失敗しました',
-		"Can't execute ladmin.*"
-			=> 'ladminの実行に失敗しました',
-		'UserID "(.+)" is already used.*'
-			=> 'ID "$1" は既に使用されています.',
-		'You can use UserID \"(.+)\".*'
-			=> 'ID "$1" は使用可能です.',
-		
-		'account making'	=>'アカウント作成',
-		'\>UserID'			=>'>ID',
-		'\>Password'		=>'>パスワード',
-		'\>Gender'			=>'>性別',
-		'\>Male'			=>'>男性',
-		'\>Female'			=>'>女性',
-		'\"Make Account\"'	=>'"アカウント作成"',
-		'\"Check UserID\"'	=>'"IDのチェック"',
-	);
-	map { $langconv{$_}=$tmp{$_}; } keys (%tmp);
-}
-
-# ----- 追加 -----
-if( $cgi->param("addaccount") ){
-	my($userid)= $cgi->param("userid");
-	my($passwd)= $cgi->param("passwd");
-	my($gender)= lc(substr($cgi->param("gender"),0,1));
-	if(length($userid)<4 || length($userid)>24){
-		HttpError("input UserID 4-24 bytes.");
-	}
-	if(length($passwd)<4 || length($passwd)>24){
-		HttpError("input Password 4-24 bytes.");
-	}
-	if($userid=~/[^0-9A-Za-z\@\_\-\']/){
-		HttpError("Illeagal charactor found in UserID.");
-	}
-	if($passwd=~/[\x00-\x1f\x80-\xff\']/){
-		HttpError("Illeagal charactor found in Password.");
-	}
-	if($gender!~/[mf]/){
-		HttpError("Gender error.");
-	}
-	open PIPE,"$perl $ladmin --add $userid $gender $passwd |"
-		or HttpError("Can't execute ladmin.");
-	my(@msg)=<PIPE>;
-	close PIPE;
-	HttpMsg(@msg);
-}
-# ----- 存在チェック -----
-elsif( $cgi->param("check") ){
-	my($userid)= $cgi->param("userid");
-	if(length($userid)<4 || length($userid)>24){
-		HttpError("input UserID 4-24 bytes.");
-	}
-	if($userid=~/[^0-9A-Za-z\@\_\-\']/){
-		HttpError("Illeagal charactor found in UserID.");
-	}
-	open PIPE,"$perl $ladmin --search --regex \\b$userid\\b |"
-		or HttpError("Can't execute ladmin.");
-	my(@msg)=<PIPE>;
-	close PIPE;
-	if(scalar(@msg)==6 && (split /[\s\0]+/,substr($msg[4],11,24))[0] eq $userid){
-		HttpMsg("NG : UserID \"$userid\" is already used.");
-	}elsif(scalar(@msg)==5){
-		HttpMsg("OK : You can use UserID \"$userid\"");
-	}
-	HttpError("ladmin error ?\n---output---\n",@msg);
-}
-
-# ----- フォーム -----
-else{
-	print LangConv( <<"EOM" );
-Content-type: text/html\n
-<html>
- <head>
-  <title>Athena account making cgi</title>
- </head>
- <body>
-  <h1>Athena account making cgi</h1>
-  <form action="$cgiuri" method="post">
-   <table border=2>
-    <tr>
-     <th>UserID</th>
-     <td><input name="userid" size=24 maxlength=24></td>
-    </tr>
-    <tr>
-     <th>Password</th>
-     <td><input name="passwd" size=24 maxlength=24 type="password"></td>
-    </tr>
-    <tr>
-     <th>Gender</th>
-     <td>
-      <input type="radio" name="gender" value="male">Male
-      <input type="radio" name="gender" value="female">Female
-     </td>
-    </tr>
-    <tr>
-     <td colspan=2>
-      <input type="submit" name="addaccount" value="Make Account">
-      <input type="submit" name="check" value="Check UserID">
-     </td>
-    </tr>
-   </table>
-  </form>
- </body>
-</html>
-EOM
-	exit;
-}
-
-sub LangConv {
-	my(@lst)= @_;
-	my($a,$b,@out)=();
-	foreach $a(@lst){
-		foreach $b(keys %langconv){
-			$a=~s/$b/$langconv{$b}/g;
-			my($rep1)=$1;
-			$a=~s/\$1/$rep1/g;
-		}
-		push @out,$a;
-	}
-	return @out;
-}
-
-sub HttpMsg {
-	my($msg)=join("", LangConv(@_));
-	$msg=~s/\n/<br>\n/g;
-	print LangConv("Content-type: text/html\n\n"),$msg;
-	exit;
-}
-
-sub HttpError {
-	my($msg)=join("", LangConv(@_));
-	$msg=~s/\n/<br>\n/g;
-	print LangConv("Content-type: text/html\n\n"),$msg;
-	exit;
-}
-
+#!/usr/bin/perl
+
+#=========================================================================
+# addaccount.cgi  ver.1.00
+#	ladminをラップした、アカウントを作成するCGI。
+#	ladmin ver.1.04での動作を確認。
+#
+# ** 設定方法 **
+#
+# - 下の$ladmin変数にladminへのパスを設定すること。
+# - UNIX系OSで使用する場合はladminと共に改行コードを変換すること、また
+#   ファイル先頭行をperlの正しいパスにすること。例> $ which perl
+# - サーバープログラムやブラウザによっては $cgiuri にこのファイルへの
+#   完全なURIをセットしなければならない場合もある。
+# - perlにパスが通っていない場合は $perl をperlへの正しいパスにすること。
+# - 他は普通のCGIと同じです。(実行権やcgi-binフォルダなど)
+#
+# ** その他 **
+#   addaccount.cgi をブラウザで開くとサンプルHTML(そのまま使えます)が
+#   開きます。また、このcgiはブラウザから送られるAccept-Languageが
+#   jaで始まっていればメッセージの一部を日本語に変換します。
+#   (IEならインターネットオプションの言語設定で一番上に日本語を置く)
+#	それ以外の場合は英語のまま出力します。
+#-------------------------------------------------------------------------
+
+my($ladmin)	= "../ladmin";			# ladminのパス(おそらく変更が必要)
+
+my($cgiuri)	= "./addaccount.cgi";	# このファイルのURI
+my($perl)	= "perl";				# perlのコマンド名
+
+
+
+#--------------------------- 設定ここまで --------------------------------
+
+
+
+
+
+
+use strict;
+use CGI;
+
+my($cgi)= new CGI;
+my(%langconv)=(
+	'Athena login-server administration tool.*' => '',
+	'logged on.*' => '',
+);
+
+# ----- 日本語環境なら変換テーブルをセット -----
+if($ENV{'HTTP_ACCEPT_LANGUAGE'}=~/^ja/){
+	my(%tmp)=(
+		'Account \[(.+)\] is successfully created.*'
+			=> 'アカウント "$1" を作成しました.',
+		'Account \[(.+)\] creation failed\. same account exists.*'
+			=> 'アカウント "$1" は既に存在します.',
+		'Illeagal charactor found in UserID.*'
+			=> 'IDの中に不正な文字があります.',
+		'Illeagal charactor found in Password.*'
+			=> 'Passwordの中に不正な文字があります.',
+		'input UserID 4-24 bytes.'
+			=> 'IDは半角4~24文字で入力してください.',
+		'input Password 4-24 bytes.'
+			=> 'Passwordは半角4~24文字で入力してください.',
+		'Illeagal gender.*'
+			=> '性別がおかしいです.',
+		'Cant connect to login server.*'
+			=> 'ログインサーバーに接続できません.',
+		'login error.*'
+			=> 'ログインサーバーへの管理者権限ログインに失敗しました',
+		"Can't execute ladmin.*"
+			=> 'ladminの実行に失敗しました',
+		'UserID "(.+)" is already used.*'
+			=> 'ID "$1" は既に使用されています.',
+		'You can use UserID \"(.+)\".*'
+			=> 'ID "$1" は使用可能です.',
+		
+		'account making'	=>'アカウント作成',
+		'\>UserID'			=>'>ID',
+		'\>Password'		=>'>パスワード',
+		'\>Gender'			=>'>性別',
+		'\>Male'			=>'>男性',
+		'\>Female'			=>'>女性',
+		'\"Make Account\"'	=>'"アカウント作成"',
+		'\"Check UserID\"'	=>'"IDのチェック"',
+	);
+	map { $langconv{$_}=$tmp{$_}; } keys (%tmp);
+}
+
+# ----- 追加 -----
+if( $cgi->param("addaccount") ){
+	my($userid)= $cgi->param("userid");
+	my($passwd)= $cgi->param("passwd");
+	my($gender)= lc(substr($cgi->param("gender"),0,1));
+	if(length($userid)<4 || length($userid)>24){
+		HttpError("input UserID 4-24 bytes.");
+	}
+	if(length($passwd)<4 || length($passwd)>24){
+		HttpError("input Password 4-24 bytes.");
+	}
+	if($userid=~/[^0-9A-Za-z\@\_\-\']/){
+		HttpError("Illeagal charactor found in UserID.");
+	}
+	if($passwd=~/[\x00-\x1f\x80-\xff\']/){
+		HttpError("Illeagal charactor found in Password.");
+	}
+	if($gender!~/[mf]/){
+		HttpError("Gender error.");
+	}
+	open PIPE,"$perl $ladmin --add $userid $gender $passwd |"
+		or HttpError("Can't execute ladmin.");
+	my(@msg)=<PIPE>;
+	close PIPE;
+	HttpMsg(@msg);
+}
+# ----- 存在チェック -----
+elsif( $cgi->param("check") ){
+	my($userid)= $cgi->param("userid");
+	if(length($userid)<4 || length($userid)>24){
+		HttpError("input UserID 4-24 bytes.");
+	}
+	if($userid=~/[^0-9A-Za-z\@\_\-\']/){
+		HttpError("Illeagal charactor found in UserID.");
+	}
+	open PIPE,"$perl $ladmin --search --regex \\b$userid\\b |"
+		or HttpError("Can't execute ladmin.");
+	my(@msg)=<PIPE>;
+	close PIPE;
+	if(scalar(@msg)==6 && (split /[\s\0]+/,substr($msg[4],11,24))[0] eq $userid){
+		HttpMsg("NG : UserID \"$userid\" is already used.");
+	}elsif(scalar(@msg)==5){
+		HttpMsg("OK : You can use UserID \"$userid\"");
+	}
+	HttpError("ladmin error ?\n---output---\n",@msg);
+}
+
+# ----- フォーム -----
+else{
+	print LangConv( <<"EOM" );
+Content-type: text/html\n
+<html>
+ <head>
+  <title>Athena account making cgi</title>
+ </head>
+ <body>
+  <h1>Athena account making cgi</h1>
+  <form action="$cgiuri" method="post">
+   <table border=2>
+    <tr>
+     <th>UserID</th>
+     <td><input name="userid" size=24 maxlength=24></td>
+    </tr>
+    <tr>
+     <th>Password</th>
+     <td><input name="passwd" size=24 maxlength=24 type="password"></td>
+    </tr>
+    <tr>
+     <th>Gender</th>
+     <td>
+      <input type="radio" name="gender" value="male">Male
+      <input type="radio" name="gender" value="female">Female
+     </td>
+    </tr>
+    <tr>
+     <td colspan=2>
+      <input type="submit" name="addaccount" value="Make Account">
+      <input type="submit" name="check" value="Check UserID">
+     </td>
+    </tr>
+   </table>
+  </form>
+ </body>
+</html>
+EOM
+	exit;
+}
+
+sub LangConv {
+	my(@lst)= @_;
+	my($a,$b,@out)=();
+	foreach $a(@lst){
+		foreach $b(keys %langconv){
+			$a=~s/$b/$langconv{$b}/g;
+			my($rep1)=$1;
+			$a=~s/\$1/$rep1/g;
+		}
+		push @out,$a;
+	}
+	return @out;
+}
+
+sub HttpMsg {
+	my($msg)=join("", LangConv(@_));
+	$msg=~s/\n/<br>\n/g;
+	print LangConv("Content-type: text/html\n\n"),$msg;
+	exit;
+}
+
+sub HttpError {
+	my($msg)=join("", LangConv(@_));
+	$msg=~s/\n/<br>\n/g;
+	print LangConv("Content-type: text/html\n\n"),$msg;
+	exit;
+}
+

+ 85 - 85
src/tool/checkversion

@@ -1,85 +1,85 @@
-#!/usr/bin/perl -w
-
-##########################################################################
-# INFORMATION TOOL ABOUT THE SERVERS VERSION OF ATHENA
-#
-# By connection on a server, this software display the version of the
-# designed server.
-#-------------------------------------------------------------------------
-# Usages:
-#   ./checkversion IP:port
-#   ./checkversion IP port
-#   perl checkversion IP:port
-#   perl checkversion IP port
-#
-# note: default port: 6900
-#
-# When successfull, the software return the value 0.
-#
-##########################################################################
-
-#------------------------- start of configuration ------------------------
-
-$connecttimeout = 10;   # Connection Timeout (in seconds)
-
-#-------------------------- End of configuration -------------------------
-
-use IO::Socket;
-
-unless($ARGV[0]) {
-	print "USAGE: $0 server_ip:port\n";
-	exit(1);
-}
-
-$server = $ARGV[0];
-$port = $ARGV[1];
-$port = $1 if ($server =~ s/:(\d+)//);
-$port ||= 6900;
-
-# Connection to the server
-my($so,$er) = ();
-eval{
-	$so = IO::Socket::INET->new(
-		PeerAddr=> $server,
-		PeerPort=> $port,
-		Proto   => "tcp",
-		Timeout => $connecttimeout) or $er = 1;
-};
-
-if($er || $@) {
-	print "Can't not connect to server [$server:$port] !\n";
-	exit(2);
-}
-
-# Request for the server version
-print $so pack("v",30000); # 0x7530
-$so->flush();
-
-# Receiving of the answer of the server
-if (read($so,$buf,10) < 10) {
-	print "Invalid answer. It isn't an athena server or it is a too old version.\n";
-	exit(5);
-}
-
-# Sending end of connection to the server
-print $so pack("v",30002); # 0x7532
-$so->flush();
-
-# Analyse of the answer
-my($ret,$maver,$miver,$rev,$dev,$mod,$type,$mdver) = unpack("v c6 v",$buf);
-
-if ($ret != 30001) { # 0x7531
-	print "Invalid answer. It isn't an athena server or it is a too old version.\n";
-	exit(6);
-}
-
-my(@stype) = ();
-foreach $i(0..3) {
-	push @stype,(("login","char","inter","map")[$i]) if( $type & (1<<$i) );
-}
-print "  ".join("/",@stype)." server [$server:$port].\n";
-printf "  Athena version %s-%d.%d", ("stable","dev")[$dev], $maver,$miver;
-printf " revision %d",$rev if $rev;
-printf "%s%d\n",("","-mod")[$mod],$mdver;
-
-exit(0);
+#!/usr/bin/perl -w
+
+##########################################################################
+# INFORMATION TOOL ABOUT THE SERVERS VERSION OF ATHENA
+#
+# By connection on a server, this software display the version of the
+# designed server.
+#-------------------------------------------------------------------------
+# Usages:
+#   ./checkversion IP:port
+#   ./checkversion IP port
+#   perl checkversion IP:port
+#   perl checkversion IP port
+#
+# note: default port: 6900
+#
+# When successfull, the software return the value 0.
+#
+##########################################################################
+
+#------------------------- start of configuration ------------------------
+
+$connecttimeout = 10;   # Connection Timeout (in seconds)
+
+#-------------------------- End of configuration -------------------------
+
+use IO::Socket;
+
+unless($ARGV[0]) {
+	print "USAGE: $0 server_ip:port\n";
+	exit(1);
+}
+
+$server = $ARGV[0];
+$port = $ARGV[1];
+$port = $1 if ($server =~ s/:(\d+)//);
+$port ||= 6900;
+
+# Connection to the server
+my($so,$er) = ();
+eval{
+	$so = IO::Socket::INET->new(
+		PeerAddr=> $server,
+		PeerPort=> $port,
+		Proto   => "tcp",
+		Timeout => $connecttimeout) or $er = 1;
+};
+
+if($er || $@) {
+	print "Can't not connect to server [$server:$port] !\n";
+	exit(2);
+}
+
+# Request for the server version
+print $so pack("v",30000); # 0x7530
+$so->flush();
+
+# Receiving of the answer of the server
+if (read($so,$buf,10) < 10) {
+	print "Invalid answer. It isn't an athena server or it is a too old version.\n";
+	exit(5);
+}
+
+# Sending end of connection to the server
+print $so pack("v",30002); # 0x7532
+$so->flush();
+
+# Analyse of the answer
+my($ret,$maver,$miver,$rev,$dev,$mod,$type,$mdver) = unpack("v c6 v",$buf);
+
+if ($ret != 30001) { # 0x7531
+	print "Invalid answer. It isn't an athena server or it is a too old version.\n";
+	exit(6);
+}
+
+my(@stype) = ();
+foreach $i(0..3) {
+	push @stype,(("login","char","inter","map")[$i]) if( $type & (1<<$i) );
+}
+print "  ".join("/",@stype)." server [$server:$port].\n";
+printf "  Athena version %s-%d.%d", ("stable","dev")[$dev], $maver,$miver;
+printf " revision %d",$rev if $rev;
+printf "%s%d\n",("","-mod")[$mod],$mdver;
+
+exit(0);

+ 296 - 296
src/tool/convert.c

@@ -1,296 +1,296 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define RETCODE	"\r\n"
-
-#define MAX_INVENTORY 100
-#define MAX_CART 100
-#define MAX_SKILL 350
-#define GLOBAL_REG_NUM 16
-
-struct item {
-	int id;
-	short nameid;
-	short amount;
-	short equip;
-	char identify;
-	char refine;
-	char attribute;
-	short card[4];
-};
-struct point{
-	char map[16];
-	short x,y;
-};
-struct skill {
-	unsigned short id,lv,flag;
-};
-struct global_reg {
-	char str[16];
-	int value;
-};
-
-struct mmo_charstatus {
-	int char_id;
-	int account_id;
-	int base_exp,job_exp,zeny;
-
-	short class;
-	short status_point,skill_point;
-	short hp,max_hp,sp,max_sp;
-	short option,karma,manner;
-	short hair,hair_color,clothes_color;
-	int party_id,guild_id,pet_id;
-
-	short weapon,shield;
-	short head_top,head_mid,head_bottom;
-
-	char name[24];
-	unsigned char base_level,job_level;
-	unsigned char str,agi,vit,int_,dex,luk,char_num,sex;
-
-	struct point last_point,save_point,memo_point[3];
-	struct item inventory[MAX_INVENTORY],cart[MAX_CART];
-	struct skill skill[MAX_SKILL];
-	int global_reg_num;
-	struct global_reg global_reg[GLOBAL_REG_NUM];
-};
-
-int mmo_char_tostr(char *str,struct mmo_charstatus *p)
-{
-  int i;
-  sprintf(str,"%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
-	  "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
-	  "\t%s,%d,%d\t%s,%d,%d",
-	  p->char_id,p->account_id,p->char_num,p->name, //
-	  p->class,p->base_level,p->job_level,
-	  p->base_exp,p->job_exp,p->zeny,
-	  p->hp,p->max_hp,p->sp,p->max_sp,
-	  p->str,p->agi,p->vit,p->int_,p->dex,p->luk,
-	  p->status_point,p->skill_point,
-	  p->option,p->karma,p->manner,	//
-	  p->party_id,p->guild_id,p->pet_id,
-	  p->hair,p->hair_color,p->clothes_color,
-	  p->weapon,p->shield,p->head_top,p->head_mid,p->head_bottom,
-	  p->last_point.map,p->last_point.x,p->last_point.y, //
-	  p->save_point.map,p->save_point.x,p->save_point.y
-	  );
-  strcat(str,"\t");
-  for(i=0;i<3;i++)
-    if(p->memo_point[i].map[0]){
-      sprintf(str+strlen(str),"%s,%d,%d",p->memo_point[i].map,p->memo_point[i].x,p->memo_point[i].y);
-    }      
-  strcat(str,"\t");
-  for(i=0;i<MAX_INVENTORY;i++)
-    if(p->inventory[i].nameid){
-      sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
-	      p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
-	      p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute,
-	      p->inventory[i].card[0],p->inventory[i].card[1],p->inventory[i].card[2],p->inventory[i].card[3]);
-    }      
-  strcat(str,"\t");
-  for(i=0;i<MAX_CART;i++)
-    if(p->cart[i].nameid){
-      sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
-	      p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
-	      p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute,
-	      p->cart[i].card[0],p->cart[i].card[1],p->cart[i].card[2],p->cart[i].card[3]);
-    }      
-  strcat(str,"\t");
-  for(i=0;i<MAX_SKILL;i++)
-    if(p->skill[i].id){
-      sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv);
-    }      
-  strcat(str,"\t");
-  for(i=0;i<p->global_reg_num;i++)
-    sprintf(str+strlen(str),"%s,%d ",p->global_reg[i].str,p->global_reg[i].value);
-  strcat(str,"\t");
-  return 0;
-}
-
-int mmo_char_fromstr(char *str,struct mmo_charstatus *p)
-{
-  int tmp_int[256];
-  int set,next,len,i;
-
-  set=sscanf(str,"%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
-	   "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
-	   "\t%[^,],%d,%d\t%[^,],%d,%d%n",
-	   &tmp_int[0],&tmp_int[1],&tmp_int[2],p->name, //
-	   &tmp_int[3],&tmp_int[4],&tmp_int[5],
-	   &tmp_int[6],&tmp_int[7],&tmp_int[8],
-	   &tmp_int[9],&tmp_int[10],&tmp_int[11],&tmp_int[12],
-	   &tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],&tmp_int[18],
-	   &tmp_int[19],&tmp_int[20],
-	   &tmp_int[21],&tmp_int[22],&tmp_int[23], //
-	   &tmp_int[24],&tmp_int[25],
-	   &tmp_int[26],&tmp_int[27],&tmp_int[28],
-	   &tmp_int[29],&tmp_int[30],&tmp_int[31],&tmp_int[32],&tmp_int[33],
-	   p->last_point.map,&tmp_int[34],&tmp_int[35], //
-	   p->save_point.map,&tmp_int[36],&tmp_int[37],&next
-	 );
-  p->char_id=tmp_int[0];
-  p->account_id=tmp_int[1];
-  p->char_num=tmp_int[2];
-  p->class=tmp_int[3];
-  p->base_level=tmp_int[4];
-  p->job_level=tmp_int[5];
-  p->base_exp=tmp_int[6];
-  p->job_exp=tmp_int[7];
-  p->zeny=tmp_int[8];
-  p->hp=tmp_int[9];
-  p->max_hp=tmp_int[10];
-  p->sp=tmp_int[11];
-  p->max_sp=tmp_int[12];
-  p->str=tmp_int[13];
-  p->agi=tmp_int[14];
-  p->vit=tmp_int[15];
-  p->int_=tmp_int[16];
-  p->dex=tmp_int[17];
-  p->luk=tmp_int[18];
-  p->status_point=tmp_int[19];
-  p->skill_point=tmp_int[20];
-  p->option=tmp_int[21];
-  p->karma=tmp_int[22];
-  p->manner=tmp_int[23];
-  p->party_id=tmp_int[24];
-  p->guild_id=tmp_int[25];
-  p->pet_id=0;
-  p->hair=tmp_int[26];
-  p->hair_color=tmp_int[27];
-  p->clothes_color=tmp_int[28];
-  p->weapon=tmp_int[29];
-  p->shield=tmp_int[30];
-  p->head_top=tmp_int[31];
-  p->head_mid=tmp_int[32];
-  p->head_bottom=tmp_int[33];
-  p->last_point.x=tmp_int[34];
-  p->last_point.y=tmp_int[35];
-  p->save_point.x=tmp_int[36];
-  p->save_point.y=tmp_int[37];
-  if(set!=41)
-    return 0;
-  if(str[next]=='\n' || str[next]=='\r')
-    return 1;	// 新規データ
-  next++;
-  for(i=0;str[next] && str[next]!='\t';i++){
-    set=sscanf(str+next,"%[^,],%d,%d%n",p->memo_point[i].map,&tmp_int[0],&tmp_int[1],&len);
-    if(set!=3) 
-      return 0;
-    p->memo_point[i].x=tmp_int[0];
-    p->memo_point[i].y=tmp_int[1];
-    next+=len;
-    if(str[next]==' ')
-      next++;
-  }
-  next++;
-  for(i=0;str[next] && str[next]!='\t';i++){
-    set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
-	       &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
-	       &tmp_int[4],&tmp_int[5],&tmp_int[6],
-	       &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
-    if(set!=11)
-      return 0;
-    p->inventory[i].id=tmp_int[0];
-    p->inventory[i].nameid=tmp_int[1];
-    p->inventory[i].amount=tmp_int[2];
-    p->inventory[i].equip=tmp_int[3];
-    p->inventory[i].identify=tmp_int[4];
-    p->inventory[i].refine=tmp_int[5];
-    p->inventory[i].attribute=tmp_int[6];
-    p->inventory[i].card[0]=tmp_int[7];
-    p->inventory[i].card[1]=tmp_int[8];
-    p->inventory[i].card[2]=tmp_int[9];
-    p->inventory[i].card[3]=tmp_int[10];
-    next+=len;
-    if(str[next]==' ')
-      next++;
-  }
-  next++;
-  for(i=0;str[next] && str[next]!='\t';i++){
-    set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
-	       &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
-	       &tmp_int[4],&tmp_int[5],&tmp_int[6],
-	       &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
-    if(set!=11)
-      return 0;
-    p->cart[i].id=tmp_int[0];
-    p->cart[i].nameid=tmp_int[1];
-    p->cart[i].amount=tmp_int[2];
-    p->cart[i].equip=tmp_int[3];
-    p->cart[i].identify=tmp_int[4];
-    p->cart[i].refine=tmp_int[5];
-    p->cart[i].attribute=tmp_int[6];
-    p->cart[i].card[0]=tmp_int[7];
-    p->cart[i].card[1]=tmp_int[8];
-    p->cart[i].card[2]=tmp_int[9];
-    p->cart[i].card[3]=tmp_int[10];
-    next+=len;
-    if(str[next]==' ')
-      next++;
-  }
-  next++;
-  for(i=0;str[next] && str[next]!='\t';i++){
-    set=sscanf(str+next,"%d,%d%n",
-	       &tmp_int[0],&tmp_int[1],&len);
-    if(set!=2)
-      return 0;
-    p->skill[tmp_int[0]].id=tmp_int[0];
-    p->skill[tmp_int[0]].lv=tmp_int[1];
-    next+=len;
-    if(str[next]==' ')
-      next++;
-  }
-  next++;
-  for(i=0;str[next] && str[next]!='\t' && str[next]!='\n' && str[next]!='\r';i++){ //global_reg実装以前のathena.txt互換のため一応'\n'チェック
-    set=sscanf(str+next,"%[^,],%d%n",
-	       p->global_reg[i].str,&p->global_reg[i].value,&len);
-    if(set!=2)
-      return 0;
-    next+=len;
-    if(str[next]==' ')
-      next++;
-  }
-  p->global_reg_num=i;
-  return 1;
-}
-
-int mmo_char_convert(char *fname1,char *fname2)
-{
-  char line[65536];
-  int ret;
-	struct mmo_charstatus char_dat;
-  FILE *ifp,*ofp;
-
-	ifp=fopen(fname1,"r");
-	ofp=fopen(fname2,"w");
-  if(ifp==NULL) {
-  	printf("file not found %s\n",fname1);
-    return 0;
-  }
-  if(ofp==NULL) {
-  	printf("file open error %s\n",fname2);
-    return 0;
-  }
-  while(fgets(line,65535,ifp)){
-    memset(&char_dat,0,sizeof(struct mmo_charstatus));
-    ret=mmo_char_fromstr(line,&char_dat);
-    if(ret){
-	    mmo_char_tostr(line,&char_dat);
-  	  fprintf(ofp,"%s" RETCODE,line);
-    }
-  }
-  fcloseall();
-  return 0;
-}
-
-int main(int argc,char *argv[])
-{
-	if(argc < 3) {
-		printf("Usage: convert <input filename> <output filename>\n");
-		exit(0);
-	}
-	mmo_char_convert(argv[1],argv[2]);
-
-	return 0;
-}
+#include <stdio.h>
+#include <stdlib.h>
+
+#define RETCODE	"\r\n"
+
+#define MAX_INVENTORY 100
+#define MAX_CART 100
+#define MAX_SKILL 350
+#define GLOBAL_REG_NUM 16
+
+struct item {
+	int id;
+	short nameid;
+	short amount;
+	short equip;
+	char identify;
+	char refine;
+	char attribute;
+	short card[4];
+};
+struct point{
+	char map[16];
+	short x,y;
+};
+struct skill {
+	unsigned short id,lv,flag;
+};
+struct global_reg {
+	char str[16];
+	int value;
+};
+
+struct mmo_charstatus {
+	int char_id;
+	int account_id;
+	int base_exp,job_exp,zeny;
+
+	short class;
+	short status_point,skill_point;
+	short hp,max_hp,sp,max_sp;
+	short option,karma,manner;
+	short hair,hair_color,clothes_color;
+	int party_id,guild_id,pet_id;
+
+	short weapon,shield;
+	short head_top,head_mid,head_bottom;
+
+	char name[24];
+	unsigned char base_level,job_level;
+	unsigned char str,agi,vit,int_,dex,luk,char_num,sex;
+
+	struct point last_point,save_point,memo_point[3];
+	struct item inventory[MAX_INVENTORY],cart[MAX_CART];
+	struct skill skill[MAX_SKILL];
+	int global_reg_num;
+	struct global_reg global_reg[GLOBAL_REG_NUM];
+};
+
+int mmo_char_tostr(char *str,struct mmo_charstatus *p)
+{
+  int i;
+  sprintf(str,"%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+	  "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+	  "\t%s,%d,%d\t%s,%d,%d",
+	  p->char_id,p->account_id,p->char_num,p->name, //
+	  p->class,p->base_level,p->job_level,
+	  p->base_exp,p->job_exp,p->zeny,
+	  p->hp,p->max_hp,p->sp,p->max_sp,
+	  p->str,p->agi,p->vit,p->int_,p->dex,p->luk,
+	  p->status_point,p->skill_point,
+	  p->option,p->karma,p->manner,	//
+	  p->party_id,p->guild_id,p->pet_id,
+	  p->hair,p->hair_color,p->clothes_color,
+	  p->weapon,p->shield,p->head_top,p->head_mid,p->head_bottom,
+	  p->last_point.map,p->last_point.x,p->last_point.y, //
+	  p->save_point.map,p->save_point.x,p->save_point.y
+	  );
+  strcat(str,"\t");
+  for(i=0;i<3;i++)
+    if(p->memo_point[i].map[0]){
+      sprintf(str+strlen(str),"%s,%d,%d",p->memo_point[i].map,p->memo_point[i].x,p->memo_point[i].y);
+    }      
+  strcat(str,"\t");
+  for(i=0;i<MAX_INVENTORY;i++)
+    if(p->inventory[i].nameid){
+      sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
+	      p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
+	      p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute,
+	      p->inventory[i].card[0],p->inventory[i].card[1],p->inventory[i].card[2],p->inventory[i].card[3]);
+    }      
+  strcat(str,"\t");
+  for(i=0;i<MAX_CART;i++)
+    if(p->cart[i].nameid){
+      sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
+	      p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
+	      p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute,
+	      p->cart[i].card[0],p->cart[i].card[1],p->cart[i].card[2],p->cart[i].card[3]);
+    }      
+  strcat(str,"\t");
+  for(i=0;i<MAX_SKILL;i++)
+    if(p->skill[i].id){
+      sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv);
+    }      
+  strcat(str,"\t");
+  for(i=0;i<p->global_reg_num;i++)
+    sprintf(str+strlen(str),"%s,%d ",p->global_reg[i].str,p->global_reg[i].value);
+  strcat(str,"\t");
+  return 0;
+}
+
+int mmo_char_fromstr(char *str,struct mmo_charstatus *p)
+{
+  int tmp_int[256];
+  int set,next,len,i;
+
+  set=sscanf(str,"%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
+	   "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+	   "\t%[^,],%d,%d\t%[^,],%d,%d%n",
+	   &tmp_int[0],&tmp_int[1],&tmp_int[2],p->name, //
+	   &tmp_int[3],&tmp_int[4],&tmp_int[5],
+	   &tmp_int[6],&tmp_int[7],&tmp_int[8],
+	   &tmp_int[9],&tmp_int[10],&tmp_int[11],&tmp_int[12],
+	   &tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],&tmp_int[18],
+	   &tmp_int[19],&tmp_int[20],
+	   &tmp_int[21],&tmp_int[22],&tmp_int[23], //
+	   &tmp_int[24],&tmp_int[25],
+	   &tmp_int[26],&tmp_int[27],&tmp_int[28],
+	   &tmp_int[29],&tmp_int[30],&tmp_int[31],&tmp_int[32],&tmp_int[33],
+	   p->last_point.map,&tmp_int[34],&tmp_int[35], //
+	   p->save_point.map,&tmp_int[36],&tmp_int[37],&next
+	 );
+  p->char_id=tmp_int[0];
+  p->account_id=tmp_int[1];
+  p->char_num=tmp_int[2];
+  p->class=tmp_int[3];
+  p->base_level=tmp_int[4];
+  p->job_level=tmp_int[5];
+  p->base_exp=tmp_int[6];
+  p->job_exp=tmp_int[7];
+  p->zeny=tmp_int[8];
+  p->hp=tmp_int[9];
+  p->max_hp=tmp_int[10];
+  p->sp=tmp_int[11];
+  p->max_sp=tmp_int[12];
+  p->str=tmp_int[13];
+  p->agi=tmp_int[14];
+  p->vit=tmp_int[15];
+  p->int_=tmp_int[16];
+  p->dex=tmp_int[17];
+  p->luk=tmp_int[18];
+  p->status_point=tmp_int[19];
+  p->skill_point=tmp_int[20];
+  p->option=tmp_int[21];
+  p->karma=tmp_int[22];
+  p->manner=tmp_int[23];
+  p->party_id=tmp_int[24];
+  p->guild_id=tmp_int[25];
+  p->pet_id=0;
+  p->hair=tmp_int[26];
+  p->hair_color=tmp_int[27];
+  p->clothes_color=tmp_int[28];
+  p->weapon=tmp_int[29];
+  p->shield=tmp_int[30];
+  p->head_top=tmp_int[31];
+  p->head_mid=tmp_int[32];
+  p->head_bottom=tmp_int[33];
+  p->last_point.x=tmp_int[34];
+  p->last_point.y=tmp_int[35];
+  p->save_point.x=tmp_int[36];
+  p->save_point.y=tmp_int[37];
+  if(set!=41)
+    return 0;
+  if(str[next]=='\n' || str[next]=='\r')
+    return 1;	// 新規データ
+  next++;
+  for(i=0;str[next] && str[next]!='\t';i++){
+    set=sscanf(str+next,"%[^,],%d,%d%n",p->memo_point[i].map,&tmp_int[0],&tmp_int[1],&len);
+    if(set!=3) 
+      return 0;
+    p->memo_point[i].x=tmp_int[0];
+    p->memo_point[i].y=tmp_int[1];
+    next+=len;
+    if(str[next]==' ')
+      next++;
+  }
+  next++;
+  for(i=0;str[next] && str[next]!='\t';i++){
+    set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
+	       &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
+	       &tmp_int[4],&tmp_int[5],&tmp_int[6],
+	       &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
+    if(set!=11)
+      return 0;
+    p->inventory[i].id=tmp_int[0];
+    p->inventory[i].nameid=tmp_int[1];
+    p->inventory[i].amount=tmp_int[2];
+    p->inventory[i].equip=tmp_int[3];
+    p->inventory[i].identify=tmp_int[4];
+    p->inventory[i].refine=tmp_int[5];
+    p->inventory[i].attribute=tmp_int[6];
+    p->inventory[i].card[0]=tmp_int[7];
+    p->inventory[i].card[1]=tmp_int[8];
+    p->inventory[i].card[2]=tmp_int[9];
+    p->inventory[i].card[3]=tmp_int[10];
+    next+=len;
+    if(str[next]==' ')
+      next++;
+  }
+  next++;
+  for(i=0;str[next] && str[next]!='\t';i++){
+    set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
+	       &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
+	       &tmp_int[4],&tmp_int[5],&tmp_int[6],
+	       &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
+    if(set!=11)
+      return 0;
+    p->cart[i].id=tmp_int[0];
+    p->cart[i].nameid=tmp_int[1];
+    p->cart[i].amount=tmp_int[2];
+    p->cart[i].equip=tmp_int[3];
+    p->cart[i].identify=tmp_int[4];
+    p->cart[i].refine=tmp_int[5];
+    p->cart[i].attribute=tmp_int[6];
+    p->cart[i].card[0]=tmp_int[7];
+    p->cart[i].card[1]=tmp_int[8];
+    p->cart[i].card[2]=tmp_int[9];
+    p->cart[i].card[3]=tmp_int[10];
+    next+=len;
+    if(str[next]==' ')
+      next++;
+  }
+  next++;
+  for(i=0;str[next] && str[next]!='\t';i++){
+    set=sscanf(str+next,"%d,%d%n",
+	       &tmp_int[0],&tmp_int[1],&len);
+    if(set!=2)
+      return 0;
+    p->skill[tmp_int[0]].id=tmp_int[0];
+    p->skill[tmp_int[0]].lv=tmp_int[1];
+    next+=len;
+    if(str[next]==' ')
+      next++;
+  }
+  next++;
+  for(i=0;str[next] && str[next]!='\t' && str[next]!='\n' && str[next]!='\r';i++){ //global_reg実装以前のathena.txt互換のため一応'\n'チェック
+    set=sscanf(str+next,"%[^,],%d%n",
+	       p->global_reg[i].str,&p->global_reg[i].value,&len);
+    if(set!=2)
+      return 0;
+    next+=len;
+    if(str[next]==' ')
+      next++;
+  }
+  p->global_reg_num=i;
+  return 1;
+}
+
+int mmo_char_convert(char *fname1,char *fname2)
+{
+  char line[65536];
+  int ret;
+	struct mmo_charstatus char_dat;
+  FILE *ifp,*ofp;
+
+	ifp=fopen(fname1,"r");
+	ofp=fopen(fname2,"w");
+  if(ifp==NULL) {
+  	printf("file not found %s\n",fname1);
+    return 0;
+  }
+  if(ofp==NULL) {
+  	printf("file open error %s\n",fname2);
+    return 0;
+  }
+  while(fgets(line,65535,ifp)){
+    memset(&char_dat,0,sizeof(struct mmo_charstatus));
+    ret=mmo_char_fromstr(line,&char_dat);
+    if(ret){
+	    mmo_char_tostr(line,&char_dat);
+  	  fprintf(ofp,"%s" RETCODE,line);
+    }
+  }
+  fcloseall();
+  return 0;
+}
+
+int main(int argc,char *argv[])
+{
+	if(argc < 3) {
+		printf("Usage: convert <input filename> <output filename>\n");
+		exit(0);
+	}
+	mmo_char_convert(argv[1],argv[2]);
+
+	return 0;
+}

+ 122 - 122
src/tool/getlogincount

@@ -1,122 +1,122 @@
-#!/usr/bin/perl -w
-
-##########################################################################
-# INFORMATION TOOL ABOUT THE # OF ONLINE PLAYERS ON ATHENA SERVERS
-#
-# By connection on the athena login-server, this software displays the
-# number of online players.
-#
-#-------------------------------------------------------------------------
-# Software usage:
-#   Configure the IP, the port and a valid account of the server.
-#   After, use at your choice:
-#   ./getlogincount - display the number of online players on all servers.
-#   ./getlogincount --premier or
-#   ./getlogincount --first -- display the number of online players of the
-#                              first server in the received list.
-#   ./getlogincount [servername] -- display the number of online players
-#                                   of the specified server.
-#
-# If successfull, the software return the value 0.
-#
-##########################################################################
-
-#------------------------------ CONFIGURATION ----------------------------
-
-$loginserverip = "127.0.0.1";  # IP of the login-server
-$loginserverport = 6900;       # port of the login-server
-$loginaccount = "s1";          # a valid account name
-$loginpasswd = "p1";           # the password of the valid account name
-
-$connecttimeout = 10;          # Connection timeout (in seconds)
-
-#-------------------------------------------------------------------------
-
-use IO::Socket;
-
-my($sname) = $ARGV[0];
-if (!defined($sname)) {
-	$sname = "";
-}
-
-# Connection to the login-server
-my($so,$er) = ();
-eval{
-	$so = IO::Socket::INET->new(
-		PeerAddr=> $loginserverip,
-		PeerPort=> $loginserverport,
-		Proto   => "tcp",
-		Timeout => $connecttimeout) or $er=1;
-};
-if($er || $@){
-	print "Can't not connect to the login-server [${loginserverip}:$loginserverport] !\n";
-	exit(2);
-}
-
-# Request to connect on login-server
-print $so pack("v V a24 a24 C",0x0064,9,$loginaccount,$loginpasswd,3);
-$so->flush();
-
-# Fail to connect
-if(unpack("v", &soread(\$so,2)) != 0x0069) {
-	print "Login error.\n";
-	exit(3);
-}
-
-# Get length of the received packet
-my($plen) = unpack("v",&soread(\$so,2))-4;
-
-# Suppress information of the account (we need only information about the servers)
-&soread(\$so,43);
-$plen -= 43;
-
-# Check about the number of online servers
-if ($plen < 32) {
-	printf "No server is connected to login-server.\n";
-	exit(1);
-}
-
-# Read information of the servers
-my(@slist) = ();
-for(;$plen > 0;$plen -= 32) {
-	my($name,$count) = unpack("x6 a20 V",&soread(\$so,32));
-	$name = substr($name,0,index($name,"\0"));
-	push @slist, [ $name, $count ];
-}
-
-# Display the result
-if($sname eq "--first" || $sname eq "--premier") { # If we ask only for the first server
-	printf "%-20s : %5d\n",$slist[0][0],$slist[0][1];
-} elsif ($sname eq "") { # If we ask for all servers
-	foreach $i(@slist) {
-		printf "%-20s : %5d\n",$i->[0],$i->[1];
-	}
-} else { # If we ask for a specified server (by its name)
-	my($flag) = 1;
-	foreach $i(@slist) {
-		if($i->[0] eq $sname) {
-			printf "%-20s : %5d\n",$i->[0],$i->[1];
-			$flag = 0;
-		}
-	}
-	if($flag) { # If the server doesn't exist
-		printf "The server [$sname] doesn't exist.\n";
-		exit(1);
-	}
-}
-
-# End of the software
-$so->shutdown(2);
-$so->close();
-exit(0);
-
-# Sub-function: get data from the socket
-sub soread {
-	my($so,$len) = @_;
-	my($sobuf);
-	if(read($$so,$sobuf,$len) < $len) {
-		print "Socket read error.\n";
-		exit(5);
-	}
-	return $sobuf;
-};
+#!/usr/bin/perl -w
+
+##########################################################################
+# INFORMATION TOOL ABOUT THE # OF ONLINE PLAYERS ON ATHENA SERVERS
+#
+# By connection on the athena login-server, this software displays the
+# number of online players.
+#
+#-------------------------------------------------------------------------
+# Software usage:
+#   Configure the IP, the port and a valid account of the server.
+#   After, use at your choice:
+#   ./getlogincount - display the number of online players on all servers.
+#   ./getlogincount --premier or
+#   ./getlogincount --first -- display the number of online players of the
+#                              first server in the received list.
+#   ./getlogincount [servername] -- display the number of online players
+#                                   of the specified server.
+#
+# If successfull, the software return the value 0.
+#
+##########################################################################
+
+#------------------------------ CONFIGURATION ----------------------------
+
+$loginserverip = "127.0.0.1";  # IP of the login-server
+$loginserverport = 6900;       # port of the login-server
+$loginaccount = "s1";          # a valid account name
+$loginpasswd = "p1";           # the password of the valid account name
+
+$connecttimeout = 10;          # Connection timeout (in seconds)
+
+#-------------------------------------------------------------------------
+
+use IO::Socket;
+
+my($sname) = $ARGV[0];
+if (!defined($sname)) {
+	$sname = "";
+}
+
+# Connection to the login-server
+my($so,$er) = ();
+eval{
+	$so = IO::Socket::INET->new(
+		PeerAddr=> $loginserverip,
+		PeerPort=> $loginserverport,
+		Proto   => "tcp",
+		Timeout => $connecttimeout) or $er=1;
+};
+if($er || $@){
+	print "Can't not connect to the login-server [${loginserverip}:$loginserverport] !\n";
+	exit(2);
+}
+
+# Request to connect on login-server
+print $so pack("v V a24 a24 C",0x0064,9,$loginaccount,$loginpasswd,3);
+$so->flush();
+
+# Fail to connect
+if(unpack("v", &soread(\$so,2)) != 0x0069) {
+	print "Login error.\n";
+	exit(3);
+}
+
+# Get length of the received packet
+my($plen) = unpack("v",&soread(\$so,2))-4;
+
+# Suppress information of the account (we need only information about the servers)
+&soread(\$so,43);
+$plen -= 43;
+
+# Check about the number of online servers
+if ($plen < 32) {
+	printf "No server is connected to login-server.\n";
+	exit(1);
+}
+
+# Read information of the servers
+my(@slist) = ();
+for(;$plen > 0;$plen -= 32) {
+	my($name,$count) = unpack("x6 a20 V",&soread(\$so,32));
+	$name = substr($name,0,index($name,"\0"));
+	push @slist, [ $name, $count ];
+}
+
+# Display the result
+if($sname eq "--first" || $sname eq "--premier") { # If we ask only for the first server
+	printf "%-20s : %5d\n",$slist[0][0],$slist[0][1];
+} elsif ($sname eq "") { # If we ask for all servers
+	foreach $i(@slist) {
+		printf "%-20s : %5d\n",$i->[0],$i->[1];
+	}
+} else { # If we ask for a specified server (by its name)
+	my($flag) = 1;
+	foreach $i(@slist) {
+		if($i->[0] eq $sname) {
+			printf "%-20s : %5d\n",$i->[0],$i->[1];
+			$flag = 0;
+		}
+	}
+	if($flag) { # If the server doesn't exist
+		printf "The server [$sname] doesn't exist.\n";
+		exit(1);
+	}
+}
+
+# End of the software
+$so->shutdown(2);
+$so->close();
+exit(0);
+
+# Sub-function: get data from the socket
+sub soread {
+	my($so,$len) = @_;
+	my($sobuf);
+	if(read($$so,$sobuf,$len) < $len) {
+		print "Socket read error.\n";
+		exit(5);
+	}
+	return $sobuf;
+};

+ 3792 - 3792
src/tool/ladmin

@@ -1,3793 +1,3793 @@
-#!/usr/bin/perl
-use POSIX;
-##########################################################################
-# EAthena login-server remote administration tool
-# New ladamin by [Yor]
-##########################################################################
-#-------------------------------INSTRUCTIONS------------------------------
-# Set the 4 variables below:
-#   IP of the login server.
-#   Port where the login-server listens incoming packets.
-#   Password of administration (same of config_athena.conf).
-#   Displayed language of the sofware (if not correct, english is used).
-# IMPORTANT:
-#   Be sure that you authorize remote administration in login-server
-#   (see login_athena.conf, 'admin_state' parameter)
-#-------------------------------------------------------------------------
-my($loginserverip) = "127.0.0.1";        # IP of login-server
-my($loginserverport) = 6900;             # Port of login-server
-my($loginserveradminpassword) = "admin"; # Administration password
-my($connecttimeout) = 10;                # Timeout of connection (in seconds)
-my($passenc) = 2;                        # Encoding type of the password
-my($defaultlanguage) = "E";              # Default language (F: Français/E: English)
-                                         # (if it's not 'F', default is English)
-
-#-------------------------------------------------------------------------
-#  LIST of COMMANDs that you can type at the prompt:
-#    To use these commands you can only type only the first letters.
-#    You must type a minimum of letters (you can not type 'a',
-#      because ladmin doesn't know if it's for 'aide' or for 'add')
-#    <Example> q <= quit, li <= list, pass <= passwd, etc.
-#
-#  Note: every time you must give a account_name, you can use "" or '' (spaces can be included)
-#
-#  aide/help/?
-#    Display the description of the commands
-#  aide/help/? [command]
-#    Display the description of the specified command
-#
-#  add <account_name> <sex> <password>
-#    Create an account with the default email (a@a.com).
-#    Concerning the sex, only the first letter is used (F or M).
-#    The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.
-#    When the password is omitted, the input is done without displaying of the pressed keys.
-#    <example> add testname Male testpass
-#
-#  ban/banish yyyy/mm/dd hh:mm:ss <account name>
-#    Changes the final date of a banishment of an account.
-#    Same command of banset, except that account_name is at end
-#
-#  banadd <account_name> <modifier>
-#    Adds or substracts time from the final date of a banishment of an account.
-#    Modifier is done as follows:
-#      Adjustment value (-1, 1, +1, etc...)
-#      Modified element:
-#        a or y: year
-#        m:  month
-#        j or d: day
-#        h:  hour
-#        mn: minute
-#        s:  second
-#    <example> banadd testname +1m-2mn1s-6y
-#              this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-#  NOTE: If you modify the final date of a non-banished account,
-#        you fix the final date to (actual time +- adjustments)
-#
-#  banset <account_name> yyyy/mm/dd [hh:mm:ss]
-#    Changes the final date of a banishment of an account.
-#    Default time: 23:59:59
-#  banset <account_name> 0
-#    Set a non-banished account (0 = unbanished).
-#
-#  block <account name>
-#    Set state 5 (You have been blocked by the GM Team) to an account.
-#    Same command of state <account_name> 5.
-#
-#  check <account_name> <password>
-#    Check the validity of a password for an account
-#    NOTE: Server will never sends back a password.
-#          It's the only method you have to know if a password is correct.
-#          The other method is to have a ('physical') access to the accounts file.
-#
-#  create <account_name> <sex> <email> <password>
-#    Like the 'add' command, but with e-mail moreover.
-#    <example> create testname Male my@mail.com testpass
-#
-#  del <account name>
-#    Remove an account.
-#    This order requires confirmation. After confirmation, the account is deleted.
-#
-#  email <account_name> <email>
-#    Modify the e-mail of an account.
-#
-#  getcount
-#    Give the number of players online on all char-servers.
-#
-#  gm <account_name> [GM_level]
-#    Modify the GM level of an account.
-#    Default value remove GM level (GM level = 0).
-#    <example> gm testname 80
-#
-#  id <account name>
-#    Give the id of an account.
-#
-#  info <account_id>
-#    Display complete information of an account.
-#
-#  kami <message>
-#    Sends a broadcast message on all map-server (in yellow).
-#  kamib <message>
-#    Sends a broadcast message on all map-server (in blue).
-#
-#  language <language>
-#    Change the language of displaying.
-#
-#  list/ls [start_id [end_id]]
-#    Display a list of accounts.
-#    'start_id', 'end_id': indicate end and start identifiers.
-#    Research by name is not possible with this command.
-#    <example> list 10 9999999
-#
-#  listBan/lsBan [start_id [end_id]]
-#    Like list/ls, but only for accounts with state or banished
-#
-#  listGM/lsGM [start_id [end_id]]
-#    Like list/ls, but only for GM accounts
-#
-#  listOK/lsOK [start_id [end_id]]
-#    Like list/ls, but only for accounts without state and not banished
-#
-#  memo <account_name> <memo>
-#    Modify the memo of an account.
-#    'memo': it can have until 253 characters (with spaces or not).
-#
-#  name <account_id>
-#    Give the name of an account.
-#
-#  passwd <account_name> <new_password>
-#    Change the password of an account.
-#    When new password is omitted, the input is done without displaying of the pressed keys.
-#
-#  quit/end/exit
-#    End of the program of administration
-#
-#  reloadGM
-#    Reload GM configuration file
-#
-#  search <expression>
-#    Seek accounts.
-#    Displays the accounts whose names correspond.
-#  search -r/-e/--expr/--regex <expression>
-#    Seek accounts by regular expression.
-#    Displays the accounts whose names correspond.
-#
-#  sex <account_name> <sex>
-#    Modify the sex of an account.
-#    <example> sex testname Male
-#
-#  state <account_name> <new_state> <error_message_#7>
-#    Change the state of an account.
-#    'new_state': state is the state of the packet 0x006a + 1. The possibilities are:
-#                 0 = Account ok            6 = Your Game's EXE file is not the latest version
-#                 1 = Unregistered ID       7 = You are Prohibited to log in until %s
-#                 2 = Incorrect Password    8 = Server is jammed due to over populated
-#                 3 = This ID is expired    9 = No MSG
-#                 4 = Rejected from Server  100 = This ID has been totally erased
-#                 5 = You have been blocked by the GM Team
-#                 all other values are 'No MSG', then use state 9 please.
-#    'error_message_#7': message of the code error 6 = Your are Prohibited to log in until %s (packet 0x006a)
-#
-#  timeadd <account_name> <modifier>
-#    Adds or substracts time from the validity limit of an account.
-#    Modifier is done as follows:
-#      Adjustment value (-1, 1, +1, etc...)
-#      Modified element:
-#        a or y: year
-#        m:  month
-#        j or d: day
-#        h:  hour
-#        mn: minute
-#        s:  second
-#    <example> timeadd testname +1m-2mn1s-6y
-#              this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-#  NOTE: You can not modify a unlimited validity limit.
-#        If you want modify it, you want probably create a limited validity limit.
-#        So, at first, you must set the validity limit to a date/time.
-#
-#  timeset <account_name> yyyy/mm/dd [hh:mm:ss]
-#    Changes the validity limit of an account.
-#    Default time: 23:59:59
-#  timeset <account_name> 0
-#    Gives an unlimited validity limit (0 = unlimited).
-#
-#  unban/unbanish <account name>
-#    Unban an account.
-#    Same command of banset 0.
-#
-#  unblock <account name>
-#    Set state 0 (Account ok) to an account.
-#    Same command of state <account_name> 0.
-#
-#  version
-#    Display the version of the login-server.
-#
-#  who <account name>
-#    Displays complete information of an account.
-#
-#-------------------------------------------------------------------------
-# Possibilities to execute ladmin in command line by usage of the software with a parameter:
-# ./ladmin --mode param1 ...
-#
-#  --makesymlink                                    -- Create the symbolic links for a use in shell
-#  --add <account_name> <sex> <password>            -- Create an account with the default email (or -a)
-#  --ban yyyy/mm/dd hh:mm:ss <account_name>         -- Change the final date of a banishment of an account (or -b)
-#  --banadd <account_name> <modifier>               -- Add or substract time from the final date of a banishment of an account (or - ba)
-#  --banset <account_name> yyyy/mm/dd [hh:mm:ss]    -- Change the final date of a banishment of an account (or -bs)
-#  --banset <account_name> 0                        -- Unbanish an account (or -bs)
-#  --block <account_name>                           -- Set state 5 to an account (or -bl)
-#  --check <account_name> <password>                -- Check the validity of a password for an account (or -check)
-#  --create <account_name> <sex> <email> <password> -- Create an account with email (or -c)
-#  --del <account_name>                             -- Remove an account (or -d)
-#  --email <account_name> <email>                   -- Modify an email of an account (or -e)
-#  --getcount                                       -- Give the number of players online on all char-servers (or -g)
-#  --gm <account_name> <GM_level>                   -- Change the GM level of an account (or -gm)
-#  --id <account_name>                              -- Give the id of an account (or -i)
-#  --info <account_id>                              -- Display complete information of an account (or -info)
-#  --kami <message>                                 -- Sends a broadcast message on all map-server (in yellow).
-#  --kamib <message>                                -- Sends a broadcast message on all map-server (in blue).
-#  --language <language>                            -- Change the language of displaying (-lang).
-#  --list [First_id [Last_id]]                      -- Display a list of accounts (or -l)
-#  --listBan [start_id [end_id]]                    -- Display a list of accounts with state or banished (or -lBan)
-#  --listGM [First_id [Last_id]]                    -- Display a list of GM accounts (or -lGM)
-#  --listOK [start_id [end_id]]                     -- Display a list of accounts without state and not banished (or -lOK)
-#  --memo <account_name> <memo>                     -- Modify the memo of an account (or -e)
-#  --name <account_id>                              -- Give the name of an account (or -n)
-#  --passwd <account_name> <new_password>           -- Change the password of an account (or -p)
-#  --reloadGM                                       -- Reload GM configuration file (or -r)
-#  --search <expression>                            -- Seek accounts (or -s)
-#  --search -e/-r/--expr/--regex <expression>       -- Seek accounts by REGEX (or -s)
-#  --sex <account_name> <sex>                       -- Change the sex of an account (or -sex)
-#  --state <account_name> <new_state> <error_message_#7> -- Change the state of an account (or -t)
-#  --timeadd <account_name> <modifier>              -- Add or substract time from the validity limit of an account (or - ta)
-#  --timeset <account_name> yyyy/mm/dd [hh:mm:ss]   -- Change the validify limit of an account (or -ts)
-#  --timeset <account_name> 0                       -- Give a unlimited validity limit (or -ts)
-#  --unban/unbanish <account_name>                  -- Unban an account (or -uba)
-#  --unblock <account_name>                         -- Set state 0 to an account (or -ubl)
-#  --version                                        -- Display the version of the login-server (or -v)
-#  --who <account_name>                             -- Display complete information of an account (or -w)
-#
-#  <example> ./ladmin --addaccount testname Male testpass
-#
-#-------------------------------------------------------------------------
-# Possibilities to execute ladmin with symbolic links in Shell
-# To create the symbolic links, execute ladmin with the '-- makesymlink' option.
-#
-#  addaccount <account_name> <sex> <password>            -- Create an account with the default email
-#  banaccount yyyy/mm/dd hh:mm:ss <account_name>         -- Change the final date of a banishment of an account
-#  banaddaccount <account_name> <modifier>               -- Add or substract time from the final date of a banishment of an account
-#  bansetaccount <account_name> yyyy/mm/dd [hh:mm:ss]    -- Change the final date of a banishment of an account
-#  bansetaccount <account_name> 0                        -- Unbanish an account
-#  blockaccount <account_name>                           -- Set state 5 (blocked by the GM Team) to an account
-#  checkaccount <account_name> <password>                -- Check the validity of a password for an account
-#  createaccount <account_name> <sex> <email> <password> -- Create an account with email
-#  delaccount <account_name>                             -- Remove an account
-#  emailaccount <account_name> <email>                   -- Modify an email of an account
-#  getcount                                              -- Give the number of players online on all char-servers
-#  gmaccount <account_name> <GM_level>                   -- Change the GM level of an account
-#  idaccount <account_name>                              -- Give the id of an account
-#  infoaccount <account_id>                              -- Display complete information of an account
-#  kami <message>                                        -- Sends a broadcast message on all map-server (in yellow).
-#  kamib <message>                                       -- Sends a broadcast message on all map-server (in blue).
-#  ladminlanguage <language>                             -- Change the language of displaying.
-#  listaccount [First_id [Last_id]]                      -- Display a list of accounts
-#  listBanaccount [start_id [end_id]]                    -- Display a list of accounts with state or banished
-#  listGMaccount [First_id [Last_id]]                    -- Display a list of GM accounts
-#  listOKaccount [start_id [end_id]]                     -- Display a list of accounts without state and not banished
-#  loginserverversion                                    -- Display the version of the login-server
-#  memoaccount <account_name> <memo>                     -- Modify the memo of an account
-#  nameaccount <account_id>                              -- Give the name of an account
-#  passwdaccount <account_name> <new_password>           -- Change the password of an account
-#  reloadGM                                              -- Reload GM configuration file
-#  searchaccount <expression>                            -- Seek accounts
-#  searchaccount -e/-r/--expr/--regex <expression>       -- Seek accounts by REGEX
-#  sexaccount <account_name> <sex>                       -- Change the sex of an account (or -sex)
-#  stateaccount <account_name> <new_state> <error_message_#7> -- Change the state of an account
-#  timeaddaccount <account_name> <modifier>              -- Add or substract time from the validity limit of an account
-#  timesetaccount <account_name> yyyy/mm/dd [hh:mm:ss]   -- Change the validify limit of an account
-#  timesetaccount <account_name> 0                       -- Give a unlimited validity limit
-#  unbanaccount <account_name>                           -- Unban an account
-#  unblockaccount <account_name>                         -- Set state 0 (Account ok) to an account
-#  whoaccount <account_name>                             -- Display complete information of an account
-#  <exemple> ./addaccount testname Male testpass
-#
-#-------------------------------------------------------------------------
-# About the encoding:
-#
-#   The Digest::MD5 module is necessary to use the encrypted password system.
-#   When the software cannot found the Digest::MD5 module,
-#     encoding is automatically disabled ($passenc=0), which allows
-#     to use this program in any cases.
-#
-#-------------------------------------------------------------------------
-# How to use ladmin with UNIX:
-#
-# You excecute ladmin as a standard command.
-#  <Example of preparation to have an access to ladmin>
-#    $ mv ladmin ladmin_org
-#    $ nkf -eLu ladmin_org > ladmin
-#    $ chmod 700 ladmin
-#  <Example to start directly ladmin>
-#    $ perl ladmin
-#
-##########################################################################
-
-
-use strict;
-use IO::Socket;
-use Term::ReadLine;
-eval { use POSIX qw(:termios_h); };
-eval { use Digest::MD5 qw(md5); } if $passenc;
-$passenc = 0 if($@);
-
-my($ver) = "1.00";
-
-# Start of termios
-my($termios, $orgterml, $termlecho, $termlnoecho) = ();
-eval{
-	$termios = POSIX::Termios->new();
-	$termios->getattr(fileno(STDIN));
-	$orgterml = $termios->getlflag();
-	$termlecho = ECHO | ECHOK | ICANON;
-	$termlnoecho = $orgterml & ~$termlecho;
-};
-
-# Modification of termios for the displaying of passwords (no displays for pressed keys)
-sub cbreak() {
-	if ($termios) {
-		$termios->setlflag($termlnoecho);
-		$termios->setcc(VTIME, 1);
-		$termios->setattr(fileno(STDIN), TCSANOW);
-	}
-}
-# Modification of termios to return at the normal displaying (after input of the passwords)
-sub cooked() {
-	if ($termios) {
-		$termios->setlflag($orgterml);
-		$termios->setcc(VTIME,0);
-		$termios->setattr(fileno(STDIN),TCSANOW);
-	}
-}
-END{ cooked() }
-
-if ($defaultlanguage eq "F") {
-	print "Outil d'administration à distance de eAthena V.$ver\n";
-} else {
-	print "EAthena login-server administration tool V.$ver\n";
-}
-
-# Creation of the symbolic links for call of the program in line command of the shell
-if ($ARGV[0] eq "--makesymlink") {
-	symlink $0, "loginserverversion";
-	symlink $0, "addaccount";
-	symlink $0, "banaccount";
-	symlink $0, "banaddaccount";
-	symlink $0, "bansetaccount";
-	symlink $0, "blockaccount";
-	symlink $0, "checkaccount";
-	symlink $0, "createaccount";
-	symlink $0, "delaccount";
-	symlink $0, "emailaccount";
-	symlink $0, "getcount";
-	symlink $0, "gmaccount";
-	symlink $0, "idaccount";
-	symlink $0, "infoaccount";
-	symlink $0, "kami";
-	symlink $0, "kamib";
-	symlink $0, "ladminlanguage";
-	symlink $0, "listaccount";
-	symlink $0, "listBanaccount";
-	symlink $0, "listGMaccount";
-	symlink $0, "listOKaccount";
-	symlink $0, "memoaccount";
-	symlink $0, "nameaccount";
-	symlink $0, "passwdaccount";
-	symlink $0, "reloadGM";
-	symlink $0, "searchaccount";
-	symlink $0, "sexaccount";
-	symlink $0, "stateaccount";
-	symlink $0, "timeaddaccount";
-	symlink $0, "timesetaccount";
-	symlink $0, "unbanaccount";
-	symlink $0, "unblockaccount";
-	symlink $0, "whoaccount";
-	if ($defaultlanguage eq "F") {
-		print "Liens symbliques créés.\n";
-	} else {
-		print "Symbolic links created.\n";
-	}
-	exit(0);
-}
-
-# Connection to the login-server
-my($so,$er) = ();
-eval{
-	$so = IO::Socket::INET->new(
-		PeerAddr=> $loginserverip,
-		PeerPort=> $loginserverport,
-#		Proto   => "tcp",
-		Timeout => $connecttimeout) or $er = 1;
-};
-if ($er || $@) {
-	if ($defaultlanguage eq "F") {
-		print "\nImpossible de se connecter au serveur de login [${loginserverip}:$loginserverport] !\n";
-	} else {
-		print "\nImpossible to have a connection with the login-server [${loginserverip}:$loginserverport] !\n";
-	}
-	print "$!\n";	# Displaying of the error
-	exit(2);
-}
-
-# Sending the administration password
-if ($passenc == 0) {
-	print $so pack("v2a24",0x7918,0,$loginserveradminpassword);
-	$so->flush();
-} else {
-	print $so pack("v",0x791a);
-	$so->flush();
-	my($buf) = readso(4);
-	if (unpack("v",$buf) != 0x01dc) {
-		if ($defaultlanguage eq "F") {
-			print "Erreur au login (échec de la création de la clef md5).\n";
-		} else {
-			print "Error at login (failure of the md5 key creation).\n";
-		}
-	}
-	$buf = readso(unpack("x2v",$buf)-4);
-	my($md5bin) = md5(($passenc == 1) ? $buf.$loginserveradminpassword : $loginserveradminpassword.$buf);
-	print $so pack("v2a16",0x7918,$passenc,$md5bin);
-	$so->flush();
-}
-
-# Waiting of the server reply
-my($buf) = readso(3);
-
-if (unpack("v",$buf) != 0x7919 || unpack("x2c",$buf) != 0) {
-	if ($defaultlanguage eq "F") {
-		print "Erreur de login:\n";
-		print " - mot de passe incorrect,\n";
-		print " - système d'administration non activé, ou\n";
-		print " - IP non autorisée.\n";
-	} else {
-		print "Error at login:\n";
-		print " - incorrect password,\n";
-		print " - administration system not activated, or\n";
-		print " - unauthorised IP.\n";
-	}
-	quit();
-	exit(4);
-}
-
-if ($defaultlanguage eq "F") {
-	print "Connexion établie.\n";
-} else {
-	print "Established connection.\n";
-}
-
-#-------------------------------------------------------------------------
-# Here are checked the command lines with arguments and symbolic links (no prompt)
-
-if ($0 =~ /addaccount$/ ||
-    (($ARGV[0] eq "-a" || $ARGV[0] eq "--add") && ((shift @ARGV), 1))) {
-	my($r) = addaccount($ARGV[0], $ARGV[1], $ARGV[2]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /banaccount$/ || $0 =~ /banishaccount$/ ||
-         (($ARGV[0] eq "-b" || $ARGV[0] eq "--ban" || $ARGV[0] eq "--banish") && ((shift @ARGV), 1))) {
-	my($r) = bansetaccount($ARGV[1], $ARGV[2], $ARGV[0]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /banaddaccount$/ ||
-         (($ARGV[0] eq "-ba" || $ARGV[0] eq "--banadd") && ((shift @ARGV), 1))) {
-	my($r) = banaddaccount($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /bansetaccount$/ ||
-         (($ARGV[0] eq "-bs" || $ARGV[0] eq "--banset") && ((shift @ARGV), 1))) {
-	my($r) = bansetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /blockaccount$/ ||
-         (($ARGV[0] eq "-bl" || $ARGV[0] eq "--block") && ((shift @ARGV), 1))) {
-	my($r) = changestate($ARGV[0], 5, "");
-	quit();
-	exit($r);
-} elsif ($0 =~ /checkaccount$/ ||
-         (($ARGV[0] eq "-check" || $ARGV[0] eq "--check") && ((shift @ARGV), 1))) {
-	my($r) = checkaccount($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /createaccount$/ ||
-         (($ARGV[0] eq "-c" || $ARGV[0] eq "--create") && ((shift @ARGV), 1))) {
-	my($r) = createaccount($ARGV[0], $ARGV[1], $ARGV[2], $ARGV[3]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /delaccount$/ ||
-         (($ARGV[0] eq "-d" || $ARGV[0] eq "--del") && ((shift @ARGV), 1))) {
-	my($r) = delaccount($ARGV[0]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /emailaccount$/ ||
-         (($ARGV[0] eq "-e" || $ARGV[0] eq "--email") && ((shift @ARGV), 1))) {
-	my($r) = changeemail($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /getcount$/ ||
-         (($ARGV[0] eq "-g" || $ARGV[0] eq "--getcount") && ((shift @ARGV), 1))) {
-	my($r) = getlogincount();
-	quit();
-	exit($r);
-} elsif ($0 =~ /gmaccount$/ ||
-         (($ARGV[0] eq "-gm" || $ARGV[0] eq "--gm") && ((shift @ARGV), 1))) {
-	my($r) = changegmlevel($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /id$/ ||
-         (($ARGV[0] eq "-i" || $ARGV[0] eq "--id") && ((shift @ARGV), 1))) {
-	my($r) = idaccount($ARGV[0]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /infoaccount$/ ||
-         (($ARGV[0] eq "-info" || $ARGV[0] eq "--info") && ((shift @ARGV), 1))) {
-	my($r) = infoaccount($ARGV[0]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /kami$/ ||
-         (($ARGV[0] eq "-kami" || $ARGV[0] eq "--kami") && ((shift @ARGV), 1))) {
-	my($r) = sendbroadcast(0, $ARGV[0]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /kamib$/ ||
-         (($ARGV[0] eq "-kamib" || $ARGV[0] eq "--kamib") && ((shift @ARGV), 1))) {
-	my($r) = sendbroadcast(0x10, $ARGV[0]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /ladminlanguage$/ ||
-         (($ARGV[0] eq "-lang" || $ARGV[0] eq "--language") && ((shift @ARGV), 1))) {
-	my($r) = changelanguage($ARGV[0]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /listaccount$/ ||
-         (($ARGV[0] eq "-l" || $ARGV[0] eq "--list") && ((shift @ARGV), 1))) {
-	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 0); # 0: to list all
-	quit();
-	exit($r);
-} elsif ($0 =~ /listBanaccount$/ ||
-         (($ARGV[0] eq "-lBan" || $ARGV[0] eq "--listBan") && ((shift @ARGV), 1))) {
-	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 3); # 3: to list only accounts with state or banished
-	quit();
-	exit($r);
-} elsif ($0 =~ /listGMaccount$/ ||
-         (($ARGV[0] eq "-lGM" || $ARGV[0] eq "--listGM") && ((shift @ARGV), 1))) {
-	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 1); # 1: to list only GM
-	quit();
-	exit($r);
-} elsif ($0 =~ /listOKaccount$/ ||
-         (($ARGV[0] eq "-lOK" || $ARGV[0] eq "--listOK") && ((shift @ARGV), 1))) {
-	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 4); # 4: to list only accounts without state and not banished
-	quit();
-	exit($r);
-} elsif ($0 =~ /loginserverversion$/ ||
-         (($ARGV[0] eq "-v" || $ARGV[0] eq "--version") && ((shift @ARGV), 1))) {
-	my($r) = checkloginversion();
-	quit();
-	exit($r);
-} elsif ($0 =~ /memoaccount$/ ||
-         (($ARGV[0] eq "-m" || $ARGV[0] eq "--memo") && ((shift @ARGV), 1))) {
-	my($r) = changememo($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /nameaccount$/ ||
-         (($ARGV[0] eq "-n" || $ARGV[0] eq "--name") && ((shift @ARGV), 1))) {
-	my($r) = nameaccount(int($ARGV[0]));
-	quit();
-	exit($r);
-} elsif ($0 =~ /passwdaccount$/ ||
-         (($ARGV[0] eq "-p" || $ARGV[0] eq "--passwd") && ((shift @ARGV), 1))) {
-	my($r) = changepasswd($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /reloadGM$/ ||
-         (($ARGV[0] eq "-r" || $ARGV[0] eq "--reloadGM") && ((shift @ARGV), 1))) {
-	my($r) = reloadGM();
-	quit();
-	exit($r);
-} elsif ($0 =~ /searchaccount$/ ||
-         (($ARGV[0] eq "-s" || $ARGV[0] eq "--search") && ((shift @ARGV), 1))) {
-	my($r) = searchaccount($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /sexaccount$/ ||
-         (($ARGV[0] eq "-sex" || $ARGV[0] eq "--sex") && ((shift @ARGV), 1))) {
-	my($r) = changesex($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /stateaccount$/ ||
-         (($ARGV[0] eq "-t" || $ARGV[0] eq "--state") && ((shift @ARGV), 1))) {
-	my($r) = changestate($ARGV[0], $ARGV[1], $ARGV[2]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /timeaddaccount$/ ||
-         (($ARGV[0] eq "-ta" || $ARGV[0] eq "--timeadd") && ((shift @ARGV), 1))) {
-	my($r) = timeaddaccount($ARGV[0], $ARGV[1]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /timesetaccount$/ ||
-         (($ARGV[0] eq "-ts" || $ARGV[0] eq "--timeset") && ((shift @ARGV), 1))) {
-	my($r) = timesetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
-	quit();
-	exit($r);
-} elsif ($0 =~ /unbanaccount$/ || $0 =~ /unbanishaccount$/ ||
-         (($ARGV[0] eq "-uba" || $ARGV[0] eq "--unban" || $ARGV[0] eq "--unbanish") && ((shift @ARGV), 1))) {
-	my($r) = bansetaccount($ARGV[0], 0, "");
-	quit();
-	exit($r);
-} elsif ($0 =~ /unblockaccount$/ ||
-         (($ARGV[0] eq "-ubl" || $ARGV[0] eq "--unblock") && ((shift @ARGV), 1))) {
-	my($r) = changestate($ARGV[0], 0, "");
-	quit();
-	exit($r);
-} elsif ($0 =~ /whoaccount$/ ||
-         (($ARGV[0] eq "-w" || $ARGV[0] eq "--who") && ((shift @ARGV), 1))) {
-	my($r) = whoaccount($ARGV[0]);
-	quit();
-	exit($r);
-}
-
-#-------------------------------------------------------------------------
-if ($defaultlanguage eq "F") {
-	print "Lecture de la version du serveur de login...\n";
-} else {
-	print "Reading of the version of the login-server...\n";
-}
-checkloginversion();
-
-# Set the prompt line
-my($term) = new Term::ReadLine "ladmin";
-
-# Here begin the infinite loop to read prompts
-while(1) {
-	# Displaying of the prompt
-	print "\n";
-	if ($defaultlanguage eq "F") {
-		printf "\033[32mPour afficher les commandes, tapez 'Entrée'.\033[0m\n";
-	} else {
-		printf "\033[32mTo list the commands, type 'enter'.\033[0m\n";
-	}
-	my($cmd) = $term->readline("ladmin> ");
-	# split and recovery of the input
-	chomp $cmd; # remove cariage return
-	$cmd =~ s/\x1b\[\d*\w//g; # remove (esc)[(number)(1alpha) = screen control sequence
-	$cmd =~ s/[\x00-\x1f]//g; # remove control char
-	my($command, $parameters) = split /\s+/,$cmd,2; # extract command and parameters
-	$command = lc($command); # command in lowercase
-	my(@paramlist) = split /\s+/,$parameters; # get list of parameters
-
-	if ($command eq "?" || $command eq "") {
-		$command = "aide" if ($defaultlanguage eq "F");
-		$command = "help" if ($defaultlanguage ne "F");
-	}
-
-	# Analyse of the command
-	eval {
-# help
-		if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
-			displayhelp("aide", $paramlist[0]);
-		} elsif ("help" =~ /^\Q$command/) {
-			displayhelp("help", $paramlist[0]);
-
-# general commands
-		} elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(.*)/)) {
-				addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(.*)/)) {
-				addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
-			}
-
-		} elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
-			if (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+"(.*)"/)) { # yyyy/mm/dd hh:mm:ss <account_name>
-				bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+'(.*)'/)) { # yyyy/mm/dd hh:mm:ss <account_name>
-				bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} else {
-				@paramlist = split /\s+/,$parameters,3; # yyyy/mm/dd hh:mm:ss <account_name>
-				bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			}
-
-		} elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
-			}
-
-		} elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
-				bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
-				bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			}
-
-		} elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
-			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
-			} else {
-				@paramlist = split /\s+/,$parameters,1;
-				changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
-			}
-
-		} elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
-				checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				checkaccount($paramlist[0], ""); # <account_name> <password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
-				checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				checkaccount($paramlist[0], ""); # <account_name> <password>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
-			}
-
-		} elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)\s+(.*)/)) {
-				createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
-				createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)\s+(.*)/)) {
-				createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
-				createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
-			}
-
-		} elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
-			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				delaccount($paramlist[0]); # <account_name>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				delaccount($paramlist[0]); # <account_name>
-			} else {
-				@paramlist = split /\s+/,$parameters,1;
-				delaccount($paramlist[0]); # <account_name>
-			}
-
-		} elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
-			}
-
-		} elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
-			getlogincount();
-
-		} elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
-			}
-
-		} elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				idaccount($paramlist[0]); # <account_name>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				idaccount($paramlist[0]); # <account_name>
-			} else {
-				@paramlist = split /\s+/,$parameters,1;
-				idaccount($paramlist[0]); # <account_name>
-			}
-
-		} elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
-			infoaccount(int($paramlist[0])); # <account_id>
-
-		} elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
-			@paramlist = split /\s+/,$parameters,1;
-			sendbroadcast(0, $paramlist[0]); # <type> <message>
-
-		} elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
-			@paramlist = split /\s+/,$parameters,1;
-			sendbroadcast(0x10, $paramlist[0]); # <type> <message>
-
-		} elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
-			changelanguage($paramlist[0]); # <language>
-
-		} elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
-			listaccount(int($paramlist[0]), int($paramlist[1]), 0); # [start_id [end_id]] 0: to list all
-
-		} elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
-			listaccount(int($paramlist[0]), int($paramlist[1]), 3); # [start_id [end_id]] 3: to list only accounts with state or banished
-
-		} elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
-			listaccount(int($paramlist[0]), int($paramlist[1]), 1); # [start_id [end_id]] 1: to list only GM
-
-		} elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
-			listaccount(int($paramlist[0]), int($paramlist[1]), 4); # [start_id [end_id]] 4: to list only accounts without state and not banished
-
-		} elsif ("memo" =~ /^\Q$command/) {
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
-				changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
-				changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
-			} else {
-				@paramlist = split /\s+/,$parameters,2;
-				changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
-			}
-
-		} elsif ("name" =~ /^\Q$command/) {
-			nameaccount(int($paramlist[0])); # <account_id>
-
-		} elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
-				changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				changepasswd($paramlist[0], ""); # <account_name> <new_password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
-				changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				changepasswd($paramlist[0], ""); # <account_name> <new_password>
-			} else {
-				@paramlist = split /\s+/,$parameters,2;
-				changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
-			}
-
-		} elsif ("reloadgm" =~ /^\Q$command/) {
-			reloadGM();
-
-		} elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
-		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
-			if (@paramlist = ($parameters =~ m/^(-{1,2}[re]\S*)\s+(.*)/)) {
-				searchaccount($paramlist[0], $paramlist[1]); # -r/-e/--expr/--regex <expression> | <expression>
-			} else {
-				@paramlist = split /\s+/,$parameters,1;
-				searchaccount($paramlist[0], ""); # -r/-e/--expr/--regex <expression> | <expression>
-			}
-
-		} elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
-		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
-			}
-
-		} elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)\s+(.*)/)) {
-				changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)/)) {
-				changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)\s+(.*)/)) {
-				changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)/)) {
-				changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
-			} else {
-				@paramlist = split /\s+/,$parameters,3;
-				changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
-			}
-
-		} elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
-			}
-
-		} elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
-			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
-				timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
-				timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
-				timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
-				timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} else {
-				@paramlist = split /\s+/,$parameters;
-				timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			}
-
-		} elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
-			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			} else {
-				@paramlist = split /\s+/,$parameters,1;
-				bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
-			}
-
-		} elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
-			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
-			} else {
-				@paramlist = split /\s+/,$parameters,1;
-				changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
-			}
-
-		} elsif ("version" =~ /^\Q$command/) {
-			checkloginversion();
-
-		} elsif ("who" =~ /^\Q$command/) {
-			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
-				whoaccount($paramlist[0]); # <account_name>
-			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
-				whoaccount($paramlist[0]); # <account_name>
-			} else {
-				@paramlist = split /\s+/,$parameters,1;
-				whoaccount($paramlist[0]); # <account_name>
-			}
-
-# quit
-		} elsif ("quit" =~ /^\Q$command/ ||
-		         (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?
-			last;
-
-# unknown command
-		} elsif ($command) {
-			if ($defaultlanguage eq "F") {
-				print "Commande inconnue [".$command."]\n";
-			} else {
-				print "Unknown command [".$command."]\n";
-			}
-		}
-#		$term->addhistory($cmd) if $command;
-	};
-	if ($@) {
-		if ($defaultlanguage eq "F") {
-			print "Erreur [".$command."]\n$@";
-		} else {
-			print "Error [".$command."]\n$@";
-		}
-	}
-};
-
-# End of the software
-quit();
-
-if ($defaultlanguage eq "F") {
-	print "Au revoir.\n";
-} else {
-	print "Bye.\n";
-}
-exit(0);
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the version of the login-server
-sub checkloginversion() {
-	print $so pack("v",30000); # 0x7530
-	$so->flush();
-	$buf = readso(10);
-	# Analyse du Packet
-	my($ret, $maver, $miver, $rev, $dev, $mod, $type, $mdver) = unpack("vc6v", $buf);
-	if ($ret != 30001) { #0x7531
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		exit(6);
-	}
-
-	print "  Login-Server [$loginserverip:$loginserverport]\n";
-	printf "  eAthena version %s-%d.%d", ("stable", "dev")[$dev], $maver, $miver;
-	printf " revision %d", $rev if $rev;
-	printf "%s%d.\n", ("", "-mod")[$mod], $mdver;
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the help
-sub displayhelp() {
-	my($help, $receivedcommand) = @_;
-
-	my($command) = lc($receivedcommand); # command in lowercase
-
-	if ($command eq "") {
-		$command = "not a command"; # any value that is not a command
-	}
-
-	if ($command eq "?") {
-		$command = "aide" if ($defaultlanguage eq "F");
-		$command = "help" if ($defaultlanguage ne "F");
-	}
-
-	if ($help eq "aide") {
-		if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
-			printf "aide/help/?\n";
-			printf "  Affiche la description des commandes\n";
-			printf "aide/help/? [commande]\n";
-			printf "  Affiche la description de la commande specifiée\n";
-		} elsif ("help" =~ /^\Q$command/) {
-			printf "aide/help/?\n";
-			printf "  Display the description of the commands\n";
-			printf "aide/help/? [command]\n";
-			printf "  Display the description of the specified command\n";
-		} elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
-			printf "add <nomcompte> <sexe> <motdepasse>\n";
-			printf "  Crée un compte avec l'email par défaut (a\@a.com).\n";
-			printf "  Concernant le sexe, seule la première lettre compte (F ou M).\n";
-			printf "  L'e-mail est a\@a.com (e-mail par défaut). C'est comme n'avoir aucun e-mail.\n";
-			printf "  Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n";
-			printf "  <exemple> add testname Male testpass\n";
-		} elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
-			printf "ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>\n";
-			printf "  Change la date de fin de bannissement d'un compte.\n";
-			printf "  La différence avec banset est la position du nom du compte.\n";
-		} elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
-			printf "banadd <nomcompte> <Modificateur>\n";
-			printf "  Ajoute ou soustrait du temps à la date de banissement d'un compte.\n";
-			printf "  Les modificateurs sont construits comme suit:\n";
-			printf "    Valeur d'ajustement (-1, 1, +1, etc...)\n";
-			printf "    Elément modifié:\n";
-			printf "      a ou y: année\n";
-			printf "      m:      mois\n";
-			printf "      j ou d: jour\n";
-			printf "      h:      heure\n";
-			printf "      mn:     minute\n";
-			printf "      s:      seconde\n";
-			printf "  <exemple> banadd testname +1m-2mn1s-6a\n";
-			printf "            Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n";
-			printf "            et 6 ans dans le même temps.\n";
-			printf "NOTE: Si vous modifez la date de banissement d'un compte non bani,\n";
-			printf "      vous indiquez comme date (le moment actuel +- les ajustements)\n";
-		} elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
-			printf "banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n";
-			printf "  Change la date de fin de bannissement d'un compte.\n";
-			printf "  Heure par défaut: 23:59:59\n";
-			printf "banset <nomcompte> 0\n";
-			printf "  Débanni un compte (0 = de-banni).\n";
-		} elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
-			printf "block <nom compte>\n";
-			printf "  Place le status d'un compte à 5 (You have been blocked by the GM Team).\n";
-			printf "  La commande est l'équivalent de state <nom_compte> 5.\n";
-		} elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
-			printf "check <nomcompte> <motdepasse>\n";
-			printf "  Vérifie la validité d'un mot de passe pour un compte\n";
-			printf "  NOTE: Le serveur n'enverra jamais un mot de passe.\n";
-			printf "        C'est la seule méthode que vous possédez pour savoir\n";
-			printf "        si un mot de passe est le bon. L'autre méthode est\n";
-			printf "        d'avoir un accès ('physique') au fichier des comptes.\n";
-		} elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
-			printf "create <nomcompte> <sexe> <email> <motdepasse>\n";
-			printf "  Comme la commande add, mais avec l'e-mail en plus.\n";
-			printf "  <exemple> create testname Male mon\@mail.com testpass\n";
-		} elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
-			printf "del <nomcompte>\n";
-			printf "  Supprime un compte.\n";
-			printf "  La commande demande confirmation. Après confirmation, le compte est détruit.\n";
-		} elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
-			printf "email <nomcompte> <email>\n";
-			printf "  Modifie l'e-mail d'un compte.\n";
-		} elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
-			printf "getcount\n";
-			printf "  Donne le nombre de joueurs en ligne par serveur de char.\n";
-		} elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
-			printf "gm <nomcompte> [Niveau_GM]\n";
-			printf "  Modifie le niveau de GM d'un compte.\n";
-			printf "  Valeur par défaut: 0 (suppression du niveau de GM).\n";
-			printf "  <exemple> gm nomtest 80\n";
-		} elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
-			printf "id <nomcompte>\n";
-			printf "  Donne l'id d'un compte.\n";
-		} elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
-			printf "info <idcompte>\n";
-			printf "  Affiche les informations sur un compte.\n";
-		} elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
-			printf "kami <message>\n";
-			printf "  Envoi un message général sur tous les serveurs de map (en jaune).\n";
-		} elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
-			printf "kamib <message>\n";
-			printf "  Envoi un message général sur tous les serveurs de map (en bleu).\n";
-		} elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
-			printf("language <langue>\n");
-			printf("  Change la langue d'affichage.\n");
-			printf("  Langues possibles: 'Français' ou 'English'.\n");
-		} elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
-			printf "list/ls [Premier_id [Dernier_id]]\n";
-			printf "  Affiche une liste de comptes.\n";
-			printf "  'Premier_id', 'Dernier_id': indique les identifiants de départ et de fin.\n";
-			printf "  La recherche par nom n'est pas possible avec cette commande.\n";
-			printf "  <example> list 10 9999999\n";
-		} elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
-			printf "listBan/lsBan [Premier_id [Dernier_id]]\n";
-			printf "  Comme list/ls, mais seulement pour les comptes GM avec un statut ou bannis.\n";
-		} elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
-			printf "listGM/lsGM [Premier_id [Dernier_id]]\n";
-			printf "  Comme list/ls, mais seulement pour les comptes GM.\n";
-		} elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
-			printf "listOK/lsOK [Premier_id [Dernier_id]]\n";
-			printf "  Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n";
-		} elsif ("memo" =~ /^\Q$command/) {
-			printf "memo <nomcompte> <memo>\n";
-			printf "  Modifie le mémo d'un compte.\n";
-			printf "  'memo': Il peut avoir jusqu'à 253 caractères (avec des espaces ou non).\n";
-		} elsif ("name" =~ /^\Q$command/) {
-			printf "name <idcompte>\n";
-			printf "  Donne le nom d'un compte.\n";
-		} elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
-			printf "passwd <nomcompte> <nouveaumotdepasse>\n";
-			printf "  Change le mot de passe d'un compte.\n";
-			printf "  Lorsque nouveaumotdepasse est omis,\n";
-			printf "  la saisie se fait sans que la frappe ne se voit.\n";
-		} elsif ("reloadgm" =~ /^\Q$command/) {
-			printf "reloadGM\n";
-			printf "  Reload GM configuration file\n";
-		} elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
-		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
-			printf "search <expression>\n";
-			printf "  Cherche des comptes.\n";
-			printf "  Affiche les comptes dont les noms correspondent.\n";
-			printf "search -r/-e/--expr/--regex <expression>\n";
-			printf "  Cherche des comptes par expression regulière.\n";
-			printf "  Affiche les comptes dont les noms correspondent.\n";
-		} elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
-		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
-			printf "sex <nomcompte> <sexe>\n";
-			printf "  Modifie le sexe d'un compte.\n";
-			printf "  <exemple> sex testname Male\n";
-		} elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
-			printf "state <nomcompte> <nouveaustatut> <message_erreur_7>\n";
-			printf "  Change le statut d'un compte.\n";
-			printf "  'nouveaustatut': Le statut est le même que celui du packet 0x006a + 1.\n";
-			printf "               les possibilités sont:\n";
-			printf "               0 = Compte ok\n";
-			printf "               1 = Unregistered ID\n";
-			printf "               2 = Incorrect Password\n";
-			printf "               3 = This ID is expired\n";
-			printf "               4 = Rejected from Server\n";
-			printf "               5 = You have been blocked by the GM Team\n";
-			printf "               6 = Your Game's EXE file is not the latest version\n";
-			printf "               7 = You are Prohibited to log in until...\n";
-			printf "               8 = Server is jammed due to over populated\n";
-			printf "               9 = No MSG\n";
-			printf "               100 = This ID has been totally erased\n";
-			printf "               all other values are 'No MSG', then use state 9 please.\n";
-			printf "  'message_erreur_7': message du code erreur 6 =\n";
-			printf "                      = Your are Prohibited to log in until... (packet 0x006a)\n";
-		} elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
-			printf "timeadd <nomcompte> <modificateur>\n";
-			printf "  Ajoute/soustrait du temps à la limite de validité d'un compte.\n";
-			printf "  Le modificateur est composé comme suit:\n";
-			printf "    Valeur modificatrice (-1, 1, +1, etc...)\n";
-			printf "    Elément modifié:\n";
-			printf "      a ou y: année\n";
-			printf "      m:      mois\n";
-			printf "      j ou d: jour\n";
-			printf "      h:      heure\n";
-			printf "      mn:     minute\n";
-			printf "      s:      seconde\n";
-			printf "  <exemple> timeadd testname +1m-2mn1s-6a\n";
-			printf "            Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n";
-			printf "            et 6 ans dans le même temps.\n";
-			printf "NOTE: Vous ne pouvez pas modifier une limite de validité illimitée. Si vous\n";
-			printf "      désirez le faire, c'est que vous voulez probablement créer un limite de\n";
-			printf "      validité limitée. Donc, en premier, fixé une limite de valitidé.\n";
-		} elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
-			printf "timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n";
-			printf "  Change la limite de validité d'un compte.\n";
-			printf "  Heure par défaut: 23:59:59\n";
-			printf "timeset <nomcompte> 0\n";
-			printf "  Donne une limite de validité illimitée (0 = illimitée).\n";
-		} elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
-			printf "unban/unbanish <nom compte>\n";
-			printf "  Ote le banissement d'un compte.\n";
-			printf "  La commande est l'équivalent de banset <nom_compte> 0.\n";
-		} elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
-			printf "unblock <nom compte>\n";
-			printf "  Place le status d'un compte à 0 (Compte ok).\n";
-			printf "  La commande est l'équivalent de state <nom_compte> 0.\n";
-		} elsif ("version" =~ /^\Q$command/) {
-			printf "version\n";
-			printf "  Affiche la version du login-serveur.\n";
-		} elsif ("who" =~ /^\Q$command/) {
-			printf "who <nomcompte>\n";
-			printf "  Affiche les informations sur un compte.\n";
-		} elsif ("quit" =~ /^\Q$command/ ||
-		         (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
-			printf "quit/end/exit\n";
-			printf "  Fin du programme d'administration.\n";
-		} else {
-			if ($receivedcommand ne "") {
-				printf "Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", $receivedcommand;
-			}
-			print << "ENDOFAIDE";
- aide/help/?                             -- Affiche cet aide
- aide/help/? [commande]                  -- Affiche l'aide de la commande
- add <nomcompte> <sexe> <motdepasse>     -- Crée un compte (sans email)
- ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>-- Change la date finale de banismnt
- banadd/ba <nomcompte> <modificateur>    -- Ajout/soustrait du temps à la
-   exemple: ba moncompte +1m-2mn1s-2y       date finale de banissement
- banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt
- banset/bs <nomcompte> 0                 -- Dé-banis un compte.
- block <nom compte>  -- Mets le status d'un compte à 5 (blocked by the GM Team)
- check <nomcompte> <motdepasse>          -- Vérifie un mot de passe d'un compte
- create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)
- del <nomcompte>                         -- Supprime un compte
- email <nomcompte> <email>               -- Modifie l'e-mail d'un compte
- getcount                                -- Donne le nb de joueurs en ligne
- gm <nomcompte> [Niveau_GM]              -- Modifie le niveau de GM d'un compte
- id <nomcompte>                          -- Donne l'id d'un compte
- info <idcompte>                         -- Affiche les infos sur un compte
- kami <message>                          -- Envoi un message général (en jaune)
- kamib <message>                         -- Envoi un message général (en bleu)
- language <langue>                       -- Change la langue d'affichage.
- list/ls [Premier_id [Dernier_id] ]      -- Affiche une liste de comptes
- listBan/lsBan [Premier_id [Dernier_id] ]-- Affiche une liste de comptes
-                                            avec un statut ou bannis
- listGM/lsGM [Premier_id [Dernier_id] ]  -- Affiche une liste de comptes GM
- listOK/lsOK [Premier_id [Dernier_id] ]  -- Affiche une liste de comptes
-                                            sans status et non bannis
- memo <nomcompte> <memo>                 -- Modifie le memo d'un compte
- name <idcompte>                         -- Donne le nom d'un compte
- passwd <nomcompte> <nouveaumotdepasse>  -- Change le mot de passe d'un compte
- quit/end/exit                           -- Fin du programme d'administation
- reloadGM                              -- Recharger le fichier de config des GM
- search <expression>                     -- Cherche des comptes
- search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX
- sex <nomcompte> <sexe>                  -- Modifie le sexe d'un compte
- state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte
- timeadd/ta <nomcompte> <modificateur>   -- Ajout/soustrait du temps à la
-   exemple: ta moncompte +1m-2mn1s-2y       limite de validité
- timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité
- timeset/ts <nomcompte> 0                -- limite de validité = illimitée
- unban/unbanish <nom compte>             -- Ote le banissement d'un compte
- unblock <nom compte>            -- Mets le status d'un compte à 0 (Compte ok)
- version                                 -- Donne la version du login-serveur
- who <nomcompte>                         -- Affiche les infos sur un compte
-ENDOFAIDE
-			printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
-		}
-	} else {
-		if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
-			printf "aide/help/?\n";
-			printf "  Display the description of the commands\n";
-			printf "aide/help/? [command]\n";
-			printf "  Display the description of the specified command\n";
-		} elsif ("help" =~ /^\Q$command/) {
-			printf "aide/help/?\n";
-			printf "  Display the description of the commands\n";
-			printf "aide/help/? [command]\n";
-			printf "  Display the description of the specified command\n";
-		} elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
-			printf "add <account_name> <sex> <password>\n";
-			printf "  Create an account with the default email (a\@a.com).\n";
-			printf "  Concerning the sex, only the first letter is used (F or M).\n";
-			printf "  The e-mail is set to a\@a.com (default e-mail). It's like to have no e-mail.\n";
-			printf "  When the password is omitted,\n";
-			printf "  the input is done without displaying of the pressed keys.\n";
-			printf "  <example> add testname Male testpass\n";
-		} elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
-			printf "ban/banish yyyy/mm/dd hh:mm:ss <account_name>\n";
-			printf "  Changes the final date of a banishment of an account.\n";
-			printf "  The difference with banset is the position of the account name.\n";
-		} elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
-			printf "banadd <account_name> <modifier>\n";
-			printf "  Adds or substracts time from the final date of a banishment of an account.\n";
-			printf "  Modifier is done as follows:\n";
-			printf "    Adjustment value (-1, 1, +1, etc...)\n";
-			printf "    Modified element:\n";
-			printf "      a or y: year\n";
-			printf "      m:  month\n";
-			printf "      j or d: day\n";
-			printf "      h:  hour\n";
-			printf "      mn: minute\n";
-			printf "      s:  second\n";
-			printf "  <example> banadd testname +1m-2mn1s-6y\n";
-			printf "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
-			printf "            and 6 years at the same time.\n";
-			printf "NOTE: If you modify the final date of a non-banished account,\n";
-			printf "      you fix the final date to (actual time +- adjustments)\n";
-		} elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
-			printf "banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
-			printf "  Changes the final date of a banishment of an account.\n";
-			printf "  Default time: 23:59:59\n";
-			printf "banset <account_name> 0\n";
-			printf "  Set a non-banished account (0 = unbanished).\n";
-		} elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
-			printf "block <account name>\n";
-			printf "  Set state 5 (You have been blocked by the GM Team) to an account.\n";
-			printf "  Same command of state <account_name> 5.\n";
-		} elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
-			printf "check <account_name> <password>\n";
-			printf "  Check the validity of a password for an account.\n";
-			printf "  NOTE: Server will never sends back a password.\n";
-			printf "        It's the only method you have to know if a password is correct.\n";
-			printf "        The other method is to have a ('physical') access to the accounts file.\n";
-		} elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
-			printf "create <account_name> <sex> <email> <password>\n";
-			printf "  Like the 'add' command, but with e-mail moreover.\n";
-			printf "  <example> create testname Male my\@mail.com testpass\n";
-		} elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
-			printf "del <account_name>\n";
-			printf "  Remove an account.\n";
-			printf "  This order requires confirmation. After confirmation, the account is deleted.\n";
-		} elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
-			printf "email <account_name> <email>\n";
-			printf "  Modify the e-mail of an account.\n";
-		} elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
-			printf "getcount\n";
-			printf "  Give the number of players online on all char-servers.\n";
-		} elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
-			printf "gm <account_name> [GM_level]\n";
-			printf "  Modify the GM level of an account.\n";
-			printf "  Default value remove GM level (GM level = 0).\n";
-			printf "  <example> gm testname 80\n";
-		} elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
-			printf "id <account_name>\n";
-			printf "  Give the id of an account.\n";
-		} elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
-			printf "info <account_id>\n";
-			printf "  Display complete information of an account.\n";
-		} elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
-			printf "kami <message>\n";
-			printf "  Sends a broadcast message on all map-server (in yellow).\n";
-		} elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
-			printf "kamib <message>\n";
-			printf "  Sends a broadcast message on all map-server (in blue).\n";
-		} elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
-			printf("language <language>\n");
-			printf("  Change the language of displaying.\n");
-			printf("  Possible languages: Français or English.\n");
-		} elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
-			printf "list/ls [start_id [end_id]]\n";
-			printf "  Display a list of accounts.\n";
-			printf "  'start_id', 'end_id': indicate end and start identifiers.\n";
-			printf "  Research by name is not possible with this command.\n";
-			printf "  <example> list 10 9999999\n";
-		} elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
-			printf "listBan/lsBan [start_id [end_id]]\n";
-			printf "  Like list/ls, but only for accounts with state or banished.\n";
-		} elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
-			printf "listGM/lsGM [start_id [end_id]]\n";
-			printf "  Like list/ls, but only for GM accounts.\n";
-		} elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
-			printf "listOK/lsOK [start_id [end_id]]\n";
-			printf "  Like list/ls, but only for accounts without state and not banished.\n";
-		} elsif ("memo" =~ /^\Q$command/) {
-			printf "memo <account_name> <memo>\n";
-			printf "  Modify the memo of an account.\n";
-			printf "  'memo': it can have until 253 characters (with spaces or not).\n";
-		} elsif ("name" =~ /^\Q$command/) {
-			printf "name <account_id>\n";
-			printf "  Give the name of an account.\n";
-		} elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
-			printf "passwd <account_name> <new_password>\n";
-			printf "  Change the password of an account.\n";
-			printf "  When new password is omitted,\n";
-			printf "  the input is done without displaying of the pressed keys.\n";
-		} elsif ("reloadgm" =~ /^\Q$command/) {
-			printf "reloadGM\n";
-			printf "  Reload GM configuration file\n";
-		} elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
-		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
-			printf "search <expression>\n";
-			printf "  Seek accounts.\n";
-			printf "  Displays the accounts whose names correspond.\n";
-			printf "search -r/-e/--expr/--regex <expression>\n";
-			printf "  Seek accounts by regular expression.\n";
-			printf "  Displays the accounts whose names correspond.\n";
-		} elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
-		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
-			printf "sex <account_name> <sex>\n";
-			printf "  Modify the sex of an account.\n";
-			printf "  <example> sex testname Male\n";
-		} elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
-			printf "state <account_name> <new_state> <error_message_#7>\n";
-			printf "  Change the state of an account.\n";
-			printf "  'new_state': state is the state of the packet 0x006a + 1.\n";
-			printf "               The possibilities are:\n";
-			printf "               0 = Account ok\n";
-			printf "               1 = Unregistered ID\n";
-			printf "               2 = Incorrect Password\n";
-			printf "               3 = This ID is expired\n";
-			printf "               4 = Rejected from Server\n";
-			printf "               5 = You have been blocked by the GM Team\n";
-			printf "               6 = Your Game's EXE file is not the latest version\n";
-			printf "               7 = You are Prohibited to log in until...\n";
-			printf "               8 = Server is jammed due to over populated\n";
-			printf "               9 = No MSG\n";
-			printf "               100 = This ID has been totally erased\n";
-			printf "               all other values are 'No MSG', then use state 9 please.\n";
-			printf "  'error_message_#7': message of the code error 6\n";
-			printf "                      = Your are Prohibited to log in until... (packet 0x006a)\n";
-		} elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
-			printf "timeadd <account_name> <modifier>\n";
-			printf "  Adds or substracts time from the validity limit of an account.\n";
-			printf "  Modifier is done as follows:\n";
-			printf "    Adjustment value (-1, 1, +1, etc...)\n";
-			printf "    Modified element:\n";
-			printf "      a or y: year\n";
-			printf "      m:  month\n";
-			printf "      j or d: day\n";
-			printf "      h:  hour\n";
-			printf "      mn: minute\n";
-			printf "      s:  second\n";
-			printf "  <example> timeadd testname +1m-2mn1s-6y\n";
-			printf "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
-			printf "            and 6 years at the same time.\n";
-			printf "NOTE: You can not modify a unlimited validity limit.\n";
-			printf "      If you want modify it, you want probably create a limited validity limit.\n";
-			printf "      So, at first, you must set the validity limit to a date/time.\n";
-		} elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
-			printf "timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
-			printf "  Changes the validity limit of an account.\n";
-			printf "  Default time: 23:59:59\n";
-			printf "timeset <account_name> 0\n";
-			printf "  Gives an unlimited validity limit (0 = unlimited).\n";
-		} elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
-			printf "unban/unbanish <account name>\n";
-			printf "  Remove the banishment of an account.\n";
-			printf "  This command works like banset <account_name> 0.\n";
-		} elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
-			printf "unblock <account name>\n";
-			printf "  Set state 0 (Account ok) to an account.\n";
-			printf "  This command works like state <account_name> 0.\n";
-		} elsif ("version" =~ /^\Q$command/) {
-			printf "version\n";
-			printf "  Display the version of the login-server.\n";
-		} elsif ("who" =~ /^\Q$command/) {
-			printf "who <account_name>\n";
-			printf "  Displays complete information of an account.\n";
-		} elsif ("quit" =~ /^\Q$command/ ||
-		         (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
-			printf "quit/end/exit\n";
-			printf "  End of the program of administration.\n";
-		} else {
-			if ($receivedcommand ne "") {
-				printf "Unknown command [%s] for help. Displaying of all commands.\n", $receivedcommand;
-			}
-			print << "ENDOFHELP";
- aide/help/?                          -- Display this help
- aide/help/? [command]                -- Display the help of the command
- add <account_name> <sex> <password>  -- Create an account with default email
- ban/banish yyyy/mm/dd hh:mm:ss <account_name> -- Change final date of a ban
- banadd/ba <account_name> <modifier>  -- Add or substract time from the final
-   example: ba apple +1m-2mn1s-2y        date of a banishment of an account
- banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban
- banset/bs <account_name> 0           -- Un-banish an account
- block <account name>    -- Set state 5 (blocked by the GM Team) to an account
- check <account_name> <password>      -- Check the validity of a password
- create <account_name> <sex> <email> <passwrd> -- Create an account with email
- del <account_name>                   -- Remove an account
- email <account_name> <email>         -- Modify an email of an account
- getcount                             -- Give the number of players online
- gm <account_name> [GM_level]         -- Modify the GM level of an account
- id <account_name>                    -- Give the id of an account
- info <account_id>                    -- Display all information of an account
- kami <message>                       -- Sends a broadcast message (in yellow)
- kamib <message>                      -- Sends a broadcast message (in blue)
- language <language>                  -- Change the language of displaying.
- list/ls [First_id [Last_id]]         -- Display a list of accounts
- listBan/lsBan [First_id [Last_id]]   -- Display a list of accounts
-                                         with state or banished
- listGM/lsGM [First_id [Last_id]]     -- Display a list of GM accounts
- listOK/lsOK [First_id [Last_id]]     -- Display a list of accounts
-                                         without state and not banished
- memo <account_name> <memo>           -- Modify the memo of an account
- name <account_id>                    -- Give the name of an account
- passwd <account_name> <new_password> -- Change the password of an account
- quit/end/exit                        -- End of the program of administation
- reloadGM                             -- Reload GM configuration file
- search <expression>                  -- Seek accounts
- search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression
- sex <nomcompte> <sexe>               -- Modify the sex of an account
- state <account_name> <new_state> <error_message_#7> -- Change the state
- timeadd/ta <account_name> <modifier> -- Add or substract time from the
-   example: ta apple +1m-2mn1s-2y        validity limit of an account
- timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit
- timeset/ts <account_name> 0         -- Give a unlimited validity limit
- unban/unbanish <account name>       -- Remove the banishment of an account
- unblock <account name>              -- Set state 0 (Account ok) to an account
- version                             -- Gives the version of the login-server
- who <account_name>                  -- Display all information of an account
-ENDOFHELP
-			printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
-		}
-	}
-
-	return 0;
-}
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the accounts list
-sub listaccount() {
-	my($st, $ed, $listflag) = @_;
-	my($i);
-	my($n) = (0);
-	#      0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
-	if ($defaultlanguage eq "F") {
-		print " id_compte GM nom_utilisateur         sexe   count statut\n";
-	} else {
-		print "account_id GM user_name               sex    count state\n";
-	}
-	print "-------------------------------------------------------------------------------\n";
-	while(1) {
-		print $so pack("vV2", 0x7920, $st, $ed);
-		$so->flush();
-		$buf = readso(4);
-		if (unpack("v", $buf) != 0x7921) {
-			if ($defaultlanguage eq "F") {
-				print "Problème de connexion au serveur (réponse incorrecte).\n";
-			} else {
-				print "Connection error to the server (incorrect answer).\n";
-			}
-			exit(10);
-		}
-		my($len) = unpack("x2v", $buf);
-		last if ($len <= 4);
-		for($i = 4; $i < $len; $i += 38) {
-			my(@dat) = unpack("VCa24cVV", readso(38));
-			$st = $dat[0] + 1;
-			if ($listflag == 0 ||
-			    ($listflag == 1 && $dat[1] > 0) || # check GM flag
-			    ($listflag == 3 && $dat[5] != 0) || # check with state or banished
-			    ($listflag == 4 && $dat[5] == 0)) { # check without state and not banished
-				printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
-				        ($dat[1] == 0 ? "  " : $dat[1]),
-				        $dat[2],
-				        ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
-				        $dat[4],
-				        (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
-				         "Unregistered ID",
-				         "Incorrect Password",
-				         "This ID is expired",
-				         "Rejected from Server",
-				         "Blocked by the GM Team", # You have been blocked by the GM Team
-				         "Your EXE file is too old", # Your Game's EXE file is not the latest version
-				         "Banishement or\n                                                   Prohibited to login until %s", # You are Prohibited to log in until %s
-				         "Server is over populated", # Server is jammed due to over populated
-				         "No MSG",
-				         "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
-				$n++;
-			}
-		}
-	}
-	if ($defaultlanguage eq "F") {
-		if ($n == 0) {
-			print "Aucun compte trouvé.\n";
-		} elsif ($n == 1) {
-			print "1 compte trouvé.\n";
-		} else {
-			print "$n comptes trouvés.\n";
-		}
-	} else {
-		if ($n == 0) {
-			print "No account found.\n";
-		} elsif ($n == 1) {
-			print "1 account found.\n";
-		} else {
-			print "$n accounts found.\n";
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: add an account with the default e-mail
-sub addaccount() {
-	my($userid, $sex, $passwd) = @_;
-	if ($userid eq "" || !defined($userid)) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> add nomtest Male motdepassetest\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> add testname Male testpass\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-#		if ($defaultlanguage eq "F") {
-#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-#		} else {
-#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-#		}
-#		return 101;
-#	}
-	$sex = uc(substr($sex, 0, 1));
-	if ($sex !~ /^[MF]$/) {
-		if ($defaultlanguage eq "F") {
-			print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
-		} else {
-			print "Illegal gender [$sex]. Please input M or F.\n";
-		}
-		return 103;
-	}
-	if ($passwd eq "") {
-		return 108 if (($passwd = typepasswd()) eq "");
-	}
-	if (verify_password($passwd) == 0) {
-		return 104;
-	}
-	print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, "");
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7931) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 106;
-	}
-	$buf = readso(28);
-	if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
-		} else {
-			print "Account [$userid] creation failed. Same account already exists.\n";
-		}
-		return 107;
-	} else {
-		if ($defaultlanguage eq "F") {
-			printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
-		} else {
-			printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: add an account with an e-mail
-sub createaccount() {
-	my($userid, $sex, $email, $passwd) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> create nomtest Male mon\@email.com motdepassetest\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> create testname Male my\@mail.com testpass\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-#		if ($defaultlanguage eq "F") {
-#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-#		} else {
-#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-#		}
-#		return 101;
-#	}
-	$sex = uc(substr($sex, 0, 1));
-	if ($sex !~ /^[MF]$/) {
-		if ($defaultlanguage eq "F") {
-			print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
-		} else {
-			print "Illegal gender [$sex]. Please input M or F.\n";
-		}
-		return 103;
-	}
-	if (length($email) < 3) {
-		if ($defaultlanguage eq "F") {
-			print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
-		} else {
-			print "Email is too short [$email]. Please input a valid e-mail.\n";
-		}
-		return 109;
-	}
-	if (length($email) > 39) {
-		if ($defaultlanguage eq "F") {
-			print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
-		} else {
-			print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
-		}
-		return 109;
-	}
-	if (verify_email($email) == 0) {
-		if ($defaultlanguage eq "F") {
-			print "Email incorrecte [$email]. Entrez une e-mail valide svp.\n";
-		} else {
-			print "Invalid email [$email]. Please input a valid e-mail.\n";
-		}
-		return 109;
-	}
-	if ($passwd eq "") {
-		return 108 if (($passwd = typepasswd()) eq "");
-	}
-	if (verify_password($passwd) == 0) {
-		return 104;
-	}
-	print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, $email);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7931) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 106;
-	}
-	$buf = readso(28);
-	if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
-		} else {
-			print "Account [$userid] creation failed. Same account already exists.\n";
-		}
-		return 107;
-	} else {
-		if ($defaultlanguage eq "F") {
-			printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
-		} else {
-			printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: deletion of an account
-sub delaccount() {
-	my($userid) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> del nomtestasupprimer\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> del testnametodelete\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	if ($defaultlanguage eq "F") {
-		print "** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) ";
-	} else {
-		print "** Are you really sure to DELETE account [$userid]? (y/n) ";
-	}
-	if (lc(substr(<STDIN>, 0, 1)) !~ /[oy]/) {
-		if ($defaultlanguage eq "F") {
-			print "Suppression annulée\n.";
-		} else {
-			print "Deletion canceled\n";
-		}
-		return 121;
-	}
-	print $so pack("va24", 0x7932, $userid);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7933) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 122;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec de la suppression du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Account [$userid] deletion failed. Account doesn't exist.\n";
-		}
-		return 123;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Compte [$name][id: $id2] SUPPRIME avec succès.\n";
-		} else {
-			print "Account [$name][id: $id2] is successfully DELETED.\n";
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modification of a password
-sub changepasswd() {
-	my($userid, $passwd) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> passwd nomtest nouveaumotdepasse\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> passwd testname newpassword\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	if ($passwd eq "") {
-		return 134 if (($passwd = typepasswd()) eq "");
-	}
-	if (verify_password($passwd) == 0) {
-		return 131;
-	}
-	print $so pack("va24a24", 0x7934, $userid,$passwd);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7935) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 132;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec de la modification du mot de passe du compte [$userid].\n";
-			print "Le compte [$userid] n'existe pas.\n";
-		} else {
-			print "Account [$userid] password changing failed.\n";
-			print "Account [$userid] doesn't exist.\n";
-		}
-		return 133;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Modification du mot de passe du compte [$name][id: $id2] réussie.\n";
-		} else {
-			print "Account [$name][id: $id2] password successfully changed.\n";
-		}
-	}
-	return 130;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modification of an account e-mail
-sub changeemail() {
-	my($userid, $email) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> email testname nouveauemail\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> email testname newemail\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	if (length($email) < 3) {
-		if ($defaultlanguage eq "F") {
-			print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
-		} else {
-			print "Email is too short [$email]. Please input a valid e-mail.\n";
-		}
-		return 109;
-	}
-	if (length($email) > 39) {
-		if ($defaultlanguage eq "F") {
-			print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
-		} else {
-			print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
-		}
-		return 109;
-	}
-	if (verify_email($email) == 0) {
-		if ($defaultlanguage eq "F") {
-			print "Email incorrect [$email]. Entrez une e-mail valide svp.\n";
-		} else {
-			print "Invalid email [$email]. Please input a valid e-mail.\n";
-		}
-		return 109;
-	}
-	print $so pack("va24a40", 0x7940, $userid, $email);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7941) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 162;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec de la modification de l'e-mail du compte [$userid].\n";
-			print "Le compte [$userid] n'existe pas.\n";
-		} else {
-			print "Account [$userid] e-mail changing failed.\n";
-			print "Account [$userid] doesn't exist.\n";
-		}
-		return 133;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Modification de l'e-mail du compte [$name][id: $id2] réussie.\n";
-		} else {
-			print "Account [$name][id: $id2] e-mail successfully changed.\n";
-		}
-	}
-	return 160;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: search of accounts
-sub searchaccount() {
-	my($p1, $p2) = @_;
-	my($exp) = ("");
-	if ($p1 eq "-e" || $p1 eq "-r" || $p1 eq "--regex" || $p1 eq "--expr") {
-		if ($p2 eq "") {
-			if ($defaultlanguage eq "F") {
-				print "Entrez une expression régulière ou utilisez 'ls' pour avoir tous les comptes.\n";
-			} else {
-				print "Input a regular expression or use 'ls' to obtain all accounts.\n";
-			}
-			return 141;
-		}
-		$exp = $p2;
-	} else {
-		if ($p1 eq "") {
-			if ($defaultlanguage eq "F") {
-				print "Entrez une chaîne ou utilisez 'ls' pour avoir tous les comptes.\n";
-			} else {
-				print "Input a string or use 'ls' to obtain all accounts.\n";
-			}
-			return 141;
-		}
-		my($c) = 0;
-		$exp = lc($p1);
-		$exp =~ s/([\@])/\\$1/g;
-		$c += $exp =~ s/([\-\[\]])/\\$1/g;
-		$c += $exp =~ s/([\*\?])/.$1/g;
-		$c += $exp =~ s/\\\[(.)\\\-(.)\\\]/[$1-$2]/g;
-		$exp = "^$exp\$" if $c;
-	}
-	if (eval{ "" =~ /$exp/; }, $@) {
-		if ($defaultlanguage eq "F") {
-			print "Expression régulière non reconnue.\n";
-		} else {
-			print "Regular-Expression compiling failed.\n";
-		}
-		return 141;
-	}
-	my($i);
-	my($n, $st) = (0, 0);
-	#      0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
-	if ($defaultlanguage eq "F") {
-		print " id_compte GM nom_utilisateur         sexe   count statut\n";
-	} else {
-		print "account_id GM user_name               sex    count state\n";
-	}
-	print "-------------------------------------------------------------------------------\n";
-	while(1) {
-		print $so pack("vV2", 0x7920, $st, 0);
-		$so->flush();
-		$buf = readso(4);
-		if (unpack("v", $buf) != 0x7921) {
-			if ($defaultlanguage eq "F") {
-				print "Problème de connexion au serveur (réponse incorrecte).\n";
-			} else {
-				print "Connection error to the server (incorrect answer).\n";
-			}
-			exit(10);
-		}
-		my($len) = unpack("x2v", $buf);
-		last if ($len <= 4);
-		for($i = 4; $i < $len; $i += 38) {
-			my(@dat) = unpack("VCa24cVV", readso(38));
-			$st = $dat[0] + 1;
-			next if (lc($dat[2]) !~ /$exp/);
-			printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
-			        ($dat[1] == 0 ? "  " : $dat[1]),
-			        $dat[2],
-			        ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
-			        $dat[4],
-			        (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
-			         "Unregistered ID",
-			         "Incorrect Password",
-			         "This ID is expired",
-			         "Rejected from Server",
-			         "Blocked by the GM Team", # You have been blocked by the GM Team
-			         "Your EXE file is too old", # Your Game's EXE file is not the latest version
-			         "Banishement or\n                                                   Prohibited to login until %s", # You are Prohibited to log in until %s
-			         "Server is over populated", # Server is jammed due to over populated
-			         "No MSG",
-			         "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
-			$n++;
-		}
-	}
-	if ($defaultlanguage eq "F") {
-		if ($n == 0) {
-			print "Aucun compte trouvé.\n";
-		} elsif ($n == 1) {
-			print "1 compte trouvé.\n";
-		} else {
-			print "$n comptes trouvés.\n";
-		}
-	} else {
-		if ($n == 0) {
-			print "No account found.\n";
-		} elsif ($n == 1) {
-			print "1 account found.\n";
-		} else {
-			print "$n accounts found.\n";
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modify the sex of an account
-sub changesex() {
-	my($userid, $sex) = @_;
-	if ($userid eq "" || !defined($userid)) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> sex nomtest Male\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> sex testname Male\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-#		if ($defaultlanguage eq "F") {
-#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-#		} else {
-#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-#		}
-#		return 101;
-#	}
-	$sex = uc(substr($sex, 0, 1));
-	if ($sex !~ /^[MF]$/) {
-		if ($defaultlanguage eq "F") {
-			print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
-		} else {
-			print "Illegal gender [$sex]. Please input M or F.\n";
-		}
-		return 103;
-	}
-	print $so pack("va24a1", 0x793c, $userid, $sex);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x793d) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement du sexe du compte [$userid].\n";
-			print "Le compte n'existe pas ou le sexe est déjà celui demandé.\n";
-		} else {
-			print "Account [$userid] sex changing failed.\n";
-			print "Account doesn't exist or the sex is already the good sex.\n";
-		}
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Sexe du compte [$name][id: $id2] changé avec succès.\n";
-		} else {
-			print "Account [$name][id: $id2] sex successfully changed.\n";
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modify the GM level of an account
-sub changegmlevel() {
-	my($userid, $gm_level) = @_;
-	if ($userid eq "" || !defined($userid)) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> gm nomtest 80\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> gm testname 80\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-#		if ($defaultlanguage eq "F") {
-#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-#		} else {
-#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-#		}
-#		return 101;
-#	}
-	$gm_level = int($gm_level);
-	if ($gm_level < 0 || $gm_level > 99) {
-		if ($defaultlanguage eq "F") {
-			print "Niveau de GM incorrect [$gm_level]. Entrez une valeur de 0 à 99 svp.\n";
-		} else {
-			print "Illegal GM level [$gm_level]. Please input a value from 0 to 99.\n";
-		}
-		return 103;
-	}
-	print $so pack("va24C", 0x793e, $userid, $gm_level);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x793f) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement du niveau de GM du compte [$userid].\n";
-			print "Le compte n'existe pas, le niveau de GM est déjà celui demandé,\n";
-			print "ou il est impossible de modifier le fichier des comptes GM.\n";
-		} else {
-			print "Account [$userid] GM level changing failed.\n";
-			print "Account doesn't exist, the GM level is already the good GM level,\n";
-			print "or it's impossible to modify the GM accounts file.\n";
-		}
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Niveau de GM du compte [$name][id: $id2] changé avec succès.\n";
-		} else {
-			print "Account [$name][id: $id2] GM level successfully changed.\n";
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Modification of a state
-sub changestate {
-	my($userid, $s, $error_message) = @_;
-	# Valid values: 0: ok, or value of the 0x006a packet + 1
-	if ($s eq "" || (($s < 0 || $s > 9) && $s != 100)) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez une des valeurs suivantes svp:\n";
-			print "  0 = Compte ok             6 = Your Game's EXE file is not the latest version\n";
-		} else {
-			print "Please input one of these values:\n";
-			print "  0 = Account ok            6 = Your Game's EXE file is not the latest version\n";
-		}
-		print "  1 = Unregistered ID       7 = You are Prohibited to log in until %s\n";
-		print "  2 = Incorrect Password    8 = Server is jammed due to over populated\n";
-		print "  3 = This ID is expired    9 = No MSG\n";
-		print "  4 = Rejected from Server  100 = This ID has been totally erased\n";
-		print "  5 = You have been blocked by the GM Team\n";
-		if ($defaultlanguage eq "F") {
-			print "<exemples> state nomtest 5\n";
-			print "           state nomtest 7 fin de votre ban\n";
-			print "           block <nom du compte>\n";
-			print "           unblock <nom du compte>\n";
-		} else {
-			print "<examples> state testname 5\n";
-			print "           state testname 7 end of your ban\n";
-			print "           block <account name>\n";
-			print "           unblock <account name>\n";
-		}
-		return 151;
-	}
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemples> state nomtest 5\n";
-			print "           state nomtest 7 fin de votre ban\n";
-			print "           block <nom du compte>\n";
-			print "           unblock <nom du compte>\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<examples> state testname 5\n";
-			print "           state testname 7 end of your ban\n";
-			print "           block <account name>\n";
-			print "           unblock <account name>\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	if ($s != 7) {
-		$error_message = "-";
-	} else {
-		if (length($error_message) < 1) {
-			if ($defaultlanguage eq "F") {
-				print "Message d'erreur trop court. Entrez un message de 1-19 caractères.\n";
-			} else {
-				print "Error message is too short. Please input a message of 1-19 bytes.\n";
-			}
-			return 102;
-		}
-		if (length($error_message) > 19) {
-			if ($defaultlanguage eq "F") {
-				print "Message d'erreur trop long. Entrez un message de 1-19 caractères.\n";
-			} else {
-				print "Error message is too long. Please input a message of 1-19 bytes.\n";
-			}
-			return 102;
-		}
-	}
-	print $so pack("va24Va20", 0x7936, $userid, $s, $error_message);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7937) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(32);
-	my(@dat) = unpack("Va24V", $buf);
-	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
-		chop($dat[1]);
-	};
-	if ($dat[0] != -1 && $dat[0] != 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Statut du compte [$dat[1]][id: $dat[0]] changé avec succès en [";
-		} else {
-			print "Account [$dat[1]][id: $dat[0]] state successfully changed in [";
-		}
-		print ((($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
-		  "Unregistered ID",
-		  "Incorrect Password",
-		  "This ID is expired",
-		  "Rejected from Server",
-		  "You have been blocked by the GM Team",
-		  "Your Game's EXE file is not the latest version",
-		  "You are Prohibited to log in until %s",
-		  "Server is jammed due to over populated",
-		  "No MSG",
-		  "This ID has been totally erased")[$dat[2] == 100 ? 10 : $dat[2]]);
-		print "].\n";
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement du statut du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Account [$userid] state changing failed. Account doesn't exist.\n";
-		}
-	}
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the number of online players
-sub getlogincount {
-	# Request to the login-server
-	print $so pack("v", 0x7938);
-	$so->flush();
-
-	$buf = readso(4);
-	# Connection failed
-	if (unpack("v", $buf) != 0x7939) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		exit(3);
-	}
-
-	# Get length of the received packet
-	my($len) = unpack("x2v", $buf) - 4;
-
-	# Read information of the servers
-	if ($len < 1) {
-		if ($defaultlanguage eq "F") {
-			printf "  Aucun serveur n'est connecté au login serveur.\n";
-		} else {
-			printf "  No server is connected to the login-server.\n";
-		}
-	} else {
-		my(@slist) = ();
-		for(; $len > 0; $len -= 32) {
-			my($name, $count) = unpack("x6 a20 V", readso(32));
-			$name = substr($name, 0, index($name, "\0"));
-			push @slist, [ $name, $count ];
-		}
-		# Displaying of result
-		my($i);
-		if ($defaultlanguage eq "F") {
-			printf "  Nombre de joueurs en ligne (serveur: nb):\n";
-		} else {
-			printf "  Number of online players (server: number).\n";
-		}
-		foreach $i(@slist) {
-			printf "    %-20s : %5d\n", $i->[0], $i->[1];
-		}
-	}
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Modification of a memo field
-sub changememo {
-	my($userid, $memo) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> memo nomtest nouveau memo\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> memo testname new memo\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	if (length($memo) > 254) {
-		if ($defaultlanguage eq "F") {
-			print "Mémo trop long (".length($memo)." caractères).\n";
-			print "Entrez un mémo de 254 caractères maximum svp.\n";
-		} else {
-			print "Memo is too long (".length($memo)." characters).\n";
-			print "Please input a memo of 254 bytes at the maximum.\n";
-		}
-		return 102;
-	}
-	if (length($memo) == 0) {
-		print $so pack("va24v", 0x7942, $userid, 0);
-	} else {
-		print $so pack("va24va".length($memo), 0x7942, $userid, length($memo), $memo);
-	}
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7943) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement du mémo du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Account [$userid] memo changing failed. Account doesn't exist.\n";
-		}
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Mémo du compte [$name][id: $id2] changé avec succès.\n";
-		} else {
-			print "Account [$name][id: $id2] memo successfully changed.\n";
-		}
-	}
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to obtain an account id
-sub idaccount() {
-	my($userid) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> id nomtest\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> id testname\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	print $so pack("va24", 0x7944, $userid);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7945) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 122;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Impossible de trouver l'id du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Unabled to find the account [$userid] id. Account doesn't exist.\n";
-		}
-		return 123;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Le compte [$name] a pour id: $id2.\n";
-		} else {
-			print "The account [$name] have the id: $id2.\n";
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to obtain an account name
-sub nameaccount() {
-	my($id) = @_;
-	if ($id < 0) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un id ayant une valeur positive svp.\n";
-		} else {
-			print "Please input a positive value for the id.\n";
-		}
-		return 136;
-	}
-	print $so pack("vV", 0x7946, $id);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7947) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 122;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if (length($name) == 0 || $name eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
-		} else {
-			print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
-		}
-		return 123;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Le compte [id: $id2] a pour nom: $name.\n";
-		} else {
-			print "The account [id: $id2] have the name: $name.\n";
-		}
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Set a validity limit of an account
-sub timesetaccount() {
-	my($userid, $date, $time) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
-			print "           timeset <nom_du_compte> 0    (0 = illimité)\n";
-			printf "          Heure par défaut [hh:mm:ss]: 23:59:59\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
-			print "           timeset <account_name> 0   (0 = unlimited)\n";
-			printf "          Default time [hh:mm:ss]: 23:59:59\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	my($year, $month, $day) = split(/[.\-\/]/, $date);
-	my($hour, $minute, $second) = split(/:/, $time);
-	if ($time eq "") {
-		$hour = 23;
-		$minute = 59;
-		$second = 59;
-	}
-	my($timestamp);
-	if ($year eq "" ||
-	    ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
-		} else {
-			print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
-		}
-		return 102;
-	}
-	if ($year == 0) {
-		$timestamp = 0;
-	} else {
-		if ($year < 70) {
-			$year = $year + 100;
-		}
-		if ($year >= 1900) {
-			$year = $year - 1900;
-		}
-		if ($month < 1 || $month > 12) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez un mois correct svp (entre 1 et 12).\n";
-			} else {
-				print "Please give a correct value for the month (from 1 to 12).\n";
-			}
-			return 102;
-		}
-		$month = $month - 1;
-		if ($day < 1 || $day > 31) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez un jour correct svp (entre 1 et 31).\n";
-			} else {
-				print "Please give a correct value for the day (from 1 to 31).\n";
-			}
-			return 102;
-		}
-		if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
-		    ($month == 1 && $day > 29)) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez un jour correct en fonction du mois svp.\n";
-			} else {
-				print "Please give a correct value for a day of this month.\n";
-			}
-			return 102;
-		}
-		if ($hour < 0 || $hour > 23) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez une heure correcte svp (entre 0 et 23).\n";
-			} else {
-				print "Please give a correct value for the hour (from 0 to 23).\n";
-			}
-			return 102;
-		}
-		if ($minute < 0 || $minute > 59) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez des minutes correctes svp (entre 0 et 59).\n";
-			} else {
-				print "Please give a correct value for the minutes (from 0 to 59).\n";
-			}
-			return 102;
-		}
-		if ($second < 0 || $second > 59) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez des secondes correctes svp (entre 0 et 59).\n";
-			} else {
-				print "Please give a correct value for the seconds (from 0 to 59).\n";
-			}
-			return 102;
-		}
-		$timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
-		if ($timestamp == undef) {
-			if ($defaultlanguage eq "F") {
-				print "Date incorrecte.\n";
-				print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
-			} else {
-				print "Invalid date.\n";
-				print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
-			}
-			return 102;
-		}
-	}
-
-	print $so pack("va24V", 0x7948, $userid, $timestamp);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7949) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(32);
-	my(@dat) = unpack("Va24V", $buf);
-	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
-		chop($dat[1]);
-	};
-	if ($dat[0] != -1 && $dat[0] != 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
-			($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
-		} else {
-			print "Validity Limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
-			($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
-		}
-		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
-		}
-	}
-
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Add/substract time to the validity limit of an account
-sub timeaddaccount() {
-	my($userid, $modif) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "  <exemple> timeadd nomtest +1m-2mn1s-6y\n";
-			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
-			print "            et 6 ans dans le même temps.\n";
-		} else {
-			print "Please input an account name.\n";
-			print "  <example> timeadd testname +1m-2mn1s-6y\n";
-			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
-			print "            and 6 years at the same time.\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	my($year, $month, $day) = (0, 0 ,0);
-	my($hour, $minute, $second) = (0, 0 ,0);
-
-	$modif = lc($modif);
-	while (length($modif) > 0) {
-		my($value) = int($modif);
-		if ($value == 0) {
-			$modif = substr($modif, 1);
-		} else {
-			if (substr($modif, 0, 1) =~ /[\-\+]/) {
-				$modif = substr($modif, 1);
-			}
-			while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
-				$modif = substr($modif, 1);
-			}
-			if (index($modif, "s") == 0) {
-				$second = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "mn") == 0) {
-				$minute = $value;
-				$modif = substr($modif, 2);
-			} elsif (index($modif, "h") == 0) {
-				$hour = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
-				$day = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "m") == 0) {
-				$month = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
-				$year = $value;
-				$modif = substr($modif, 1);
-			} else {
-				$modif = substr($modif, 1);
-			}
-		}
-	}
-
-	if ($defaultlanguage eq "F") {
-		print " année:   $year\n";
-		print " mois:    $month\n";
-		print " jour:    $day\n";
-		print " heure:   $hour\n";
-		print " minute:  $minute\n";
-		print " seconde: $second\n";
-	} else {
-		print " year:   $year\n";
-		print " month:  $month\n";
-		print " day:    $day\n";
-		print " hour:   $hour\n";
-		print " minute: $minute\n";
-		print " second: $second\n";
-	}
-
-	if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
-		if ($defaultlanguage eq "F") {
-			print "Vous devez entrer un ajustement avec cette commande, svp:\n";
-			print "  Valeur d'ajustement (-1, 1, +1, etc...)\n";
-			print "  Element modifié:\n";
-			print "    a ou y: année\n";
-			print "    m:      mois\n";
-			print "    j ou d: jour\n";
-			print "    h:      heure\n";
-			print "    mn:     minute\n";
-			print "    s:      seconde\n";
-			print "  <exemple> timeadd nomtest +1m-2mn1s-6y\n";
-			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
-			print "            et 6 ans dans le même temps.\n";
-		} else {
-			print "Please give an adjustment with this command:\n";
-			print "  Adjustment value (-1, 1, +1, etc...)\n";
-			print "  Modified element:\n";
-			print "    a or y: year\n";
-			print "    m:      month\n";
-			print "    j or d: day\n";
-			print "    h:       hour\n";
-			print "    mn:      minute\n";
-			print "    s:       second\n";
-			print "  <example> timeadd testname +1m-2mn1s-6y\n";
-			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
-			print "            and 6 years at the same time.\n";
-		}
-		return 137;
-	}
-	if ($year > 127 || $year < -127) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the years (from -127 to 127).\n";
-		}
-		return 137;
-	}
-	if ($month > 255 || $month < -255) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the months (from -255 to 255).\n";
-		}
-		return 137;
-	}
-	if ($day > 32767 || $day < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-	if ($hour > 32767 || $hour < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-	if ($minute > 32767 || $minute < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-	if ($second > 32767 || $second < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-
-	print $so pack("va24vvvvvv", 0x7950, $userid, $year, $month, $day, $hour, $minute, $second);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7951) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(32);
-	my(@dat) = unpack("Va24V", $buf);
-	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
-		chop($dat[1]);
-	};
-	if ($dat[0] == -1 || $dat[0] == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
-		}
-	} elsif ($dat[2] == 0) {
-		if ($defaultlanguage eq "F") {
-			print "Limite de validité du compte [$dat[1]][id: $dat[0]] inchangée.\n";
-			print "Le compte a une validité illimitée ou\n";
-			print "la modification est impossible avec les ajustements demandés.\n";
-		} else {
-			print "Validity limit of the account [$dat[1]][id: $dat[0]] unchanged.\n";
-			print "The account have an unlimited validity limit or\n";
-			print "the changing is impossible with the proposed adjustments.\n";
-		}
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
-			($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
-		} else {
-			print "Validity limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
-			($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
-		}
-		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
-	}
-
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Set the final date of a banishment of an account
-sub bansetaccount() {
-	my($userid, $date, $time) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
-			print "           banset <nom_du_compte> 0    (0 = dé-bani)\n";
-			print "           ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n";
-			print "           unban/unbanish <nom du compte>\n";
-			printf "          Heure par défaut [hh:mm:ss]: 23:59:59\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
-			print "           banset <account_name> 0   (0 = un-banished)\n";
-			print "           ban/banish yyyy/mm/dd hh:mm:ss <account name>\n";
-			print "           unban/unbanish <account name>\n";
-			printf "          Default time [hh:mm:ss]: 23:59:59\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	my($year, $month, $day) = split(/[.\-\/]/, $date);
-	my($hour, $minute, $second) = split(/:/, $time);
-	if ($time eq "") {
-		$hour = 23;
-		$minute = 59;
-		$second = 59;
-	}
-	my($timestamp);
-	if ($year eq "" ||
-	    ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
-		} else {
-			print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
-		}
-		return 102;
-	}
-	if ($year == 0) {
-		$timestamp = 0;
-	} else {
-		if ($year < 70) {
-			$year = $year + 100;
-		}
-		if ($year >= 1900) {
-			$year = $year - 1900;
-		}
-		if ($month < 1 || $month > 12) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez un mois correct svp (entre 1 et 12).\n";
-			} else {
-				print "Please give a correct value for the month (from 1 to 12).\n";
-			}
-			return 102;
-		}
-		$month = $month - 1;
-		if ($day < 1 || $day > 31) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez un jour correct svp (entre 1 et 31).\n";
-			} else {
-				print "Please give a correct value for the day (from 1 to 31).\n";
-			}
-			return 102;
-		}
-		if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
-		    ($month == 1 && $day > 29)) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez un jour correct en fonction du mois svp.\n";
-			} else {
-				print "Please give a correct value for a day of this month.\n";
-			}
-			return 102;
-		}
-		if ($hour < 0 || $hour > 23) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez une heure correcte svp (entre 0 et 23).\n";
-			} else {
-				print "Please give a correct value for the hour (from 0 to 23).\n";
-			}
-			return 102;
-		}
-		if ($minute < 0 || $minute > 59) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez des minutes correctes svp (entre 0 et 59).\n";
-			} else {
-				print "Please give a correct value for the minutes (from 0 to 59).\n";
-			}
-			return 102;
-		}
-		if ($second < 0 || $second > 59) {
-			if ($defaultlanguage eq "F") {
-				print "Entrez des secondes correctes svp (entre 0 et 59).\n";
-			} else {
-				print "Please give a correct value for the seconds (from 0 to 59).\n";
-			}
-			return 102;
-		}
-		$timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
-		if ($timestamp == undef) {
-			if ($defaultlanguage eq "F") {
-				print "Date incorrecte.\n";
-				print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
-			} else {
-				print "Invalid date.\n";
-				print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
-			}
-			return 102;
-		}
-	}
-
-	print $so pack("va24V", 0x794a, $userid, $timestamp);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x794b) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(32);
-	my(@dat) = unpack("Va24V", $buf);
-	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
-		chop($dat[1]);
-	};
-	if ($dat[0] != -1 && $dat[0] != 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
-			($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
-		} else {
-			print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
-			($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
-		}
-		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
-		}
-	}
-
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Add/substract time to the final date of a banishment of an account
-sub banaddaccount() {
-	my($userid, $modif) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "  <exemple> banadd nomtest +1m-2mn1s-6y\n";
-			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
-			print "            et 6 ans dans le même temps.\n";
-		} else {
-			print "Please input an account name.\n";
-			print "  <example> banadd testname +1m-2mn1s-6y\n";
-			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
-			print "            and 6 years at the same time.\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	my($year, $month, $day) = (0, 0 ,0);
-	my($hour, $minute, $second) = (0, 0 ,0);
-
-	$modif = lc($modif);
-	while (length($modif) > 0) {
-		my($value) = int($modif);
-		if ($value == 0) {
-			$modif = substr($modif, 1);
-		} else {
-			if (substr($modif, 0, 1) =~ /[\-\+]/) {
-				$modif = substr($modif, 1);
-			}
-			while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
-				$modif = substr($modif, 1);
-			}
-			if (index($modif, "s") == 0) {
-				$second = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "mn") == 0) {
-				$minute = $value;
-				$modif = substr($modif, 2);
-			} elsif (index($modif, "h") == 0) {
-				$hour = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
-				$day = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "m") == 0) {
-				$month = $value;
-				$modif = substr($modif, 1);
-			} elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
-				$year = $value;
-				$modif = substr($modif, 1);
-			} else {
-				$modif = substr($modif, 1);
-			}
-		}
-	}
-
-	if ($defaultlanguage eq "F") {
-		print " année:   $year\n";
-		print " mois:    $month\n";
-		print " jour:    $day\n";
-		print " heure:   $hour\n";
-		print " minute:  $minute\n";
-		print " seconde: $second\n";
-	} else {
-		print " year:   $year\n";
-		print " month:  $month\n";
-		print " day:    $day\n";
-		print " hour:   $hour\n";
-		print " minute: $minute\n";
-		print " second: $second\n";
-	}
-
-	if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
-		if ($defaultlanguage eq "F") {
-			print "Vous devez entrer un ajustement avec cette commande, svp:\n";
-			print "  Valeur d'ajustement (-1, 1, +1, etc...)\n";
-			print "  Element modifié:\n";
-			print "    a ou y: année\n";
-			print "    m:      mois\n";
-			print "    j ou d: jour\n";
-			print "    h:      heure\n";
-			print "    mn:     minute\n";
-			print "    s:      seconde\n";
-			print "  <exemple> banadd nomtest +1m-2mn1s-6y\n";
-			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
-			print "            et 6 ans dans le même temps.\n";
-		} else {
-			print "Please give an adjustment with this command:\n";
-			print "  Adjustment value (-1, 1, +1, etc...)\n";
-			print "  Modified element:\n";
-			print "    a or y: year\n";
-			print "    m: month\n";
-			print "    j or d: day\n";
-			print "    h: hour\n";
-			print "    mn: minute\n";
-			print "    s: second\n";
-			print "  <example> banadd testname +1m-2mn1s-6y\n";
-			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
-			print "            and 6 years at the same time.\n";
-		}
-		return 137;
-	}
-	if ($year > 127 || $year < -127) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the years (from -127 to 127).\n";
-		}
-		return 137;
-	}
-	if ($month > 255 || $month < -255) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the months (from -255 to 255).\n";
-		}
-		return 137;
-	}
-	if ($day > 32767 || $day < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-	if ($hour > 32767 || $hour < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-	if ($minute > 32767 || $minute < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-	if ($second > 32767 || $second < -32767) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
-		} else {
-			print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
-		}
-		return 137;
-	}
-
-	print $so pack("va24vvvvvv", 0x794c, $userid, $year, $month, $day, $hour, $minute, $second);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x794d) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(32);
-	my(@dat) = unpack("Va24V", $buf);
-	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
-		chop($dat[1]);
-	};
-	if ($dat[0] == -1 || $dat[0] == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
-		}
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
-			($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
-		} else {
-			print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
-			($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
-		}
-		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
-	}
-
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to displaying information about an account (by its name)
-sub whoaccount() {
-	my($userid) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> who nomtest\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> who testname\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-
-	print $so pack("va24", 0x7952, $userid);
-	$so->flush();
-
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7953) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 122;
-	}
-	my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
-	my($memo) = "";
-	if ($memo_size > 0) {
-		$memo = unpack("a".$memo_size, readso($memo_size));
-	}
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
-		chop($error_message);
-	};
-	while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
-		chop($last_login);
-	};
-	while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
-		chop($last_ip);
-	};
-	while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
-		chop($email);
-	};
-	while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
-		chop($memo);
-	};
-
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Impossible de trouver le compte [$userid]. Le compte n'existe pas.\n";
-		} else {
-			print "Unabled to find the account [$userid]. Account doesn't exist.\n";
-		}
-		return 123;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Le compte [$userid] a les caractéristiques suivantes:\n";
-		} else {
-			print "The account [$userid] is set with:\n";
-		}
-		if ($GM_level == 0) {
-			print " Id:     $id2 (non-GM)\n";
-		} else {
-			if ($defaultlanguage eq "F") {
-				print " Id:     $id2 (GM niveau $GM_level)\n";
-			} else {
-				print " Id:     $id2 (GM level $GM_level)\n";
-			}
-		}
-		if ($defaultlanguage eq "F") {
-			print " Nom:    '$name'\n";
-			print " Sexe:   ".("Femme", "Male", "Serveur")[$sex]."\n";
-		} else {
-			print " Name:   '$name'\n";
-			print " Sex:    ".("Female", "Male", "Server")[$sex]."\n";
-		}
-		print " E-mail: $email\n";
-		if ($status == 7) {
-			print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
-		} else {
-			print " Statut: $status [".(
-			      ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
-			      "Unregistered ID",
-			      "Incorrect Password",
-			      "This ID is expired",
-			      "Rejected from Server",
-			      "You have been blocked by the GM Team",
-			      "Your Game's EXE file is not the latest version",
-			      "You are Prohibited to log in until %s",
-			      "Server is jammed due to over populated",
-			      "No MSG",
-			      "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
-		}
-		if ($defaultlanguage eq "F") {
-			print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
-			print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
-			print " Dernière connexion le: $last_login (ip: $last_ip)\n";
-			print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
-		} else {
-			print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
-			print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
-			print " Last connection at: $last_login (ip: $last_ip)\n";
-			print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
-		}
-		print " Memo:   '$memo'\n";
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to displaying information about an account (by its id)
-sub infoaccount() {
-	my($id) = @_;
-	if ($id < 0) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un id ayant une valeur positive svp.\n";
-		} else {
-			print "Please input a positive value for the id.\n";
-		}
-		return 136;
-	}
-
-	print $so pack("vV", 0x7954, $id);
-	$so->flush();
-
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x7953) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 122;
-	}
-	my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
-	my($memo) = "";
-	if ($memo_size > 0) {
-		$memo = unpack("a".$memo_size, readso($memo_size));
-	}
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
-		chop($error_message);
-	};
-	while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
-		chop($last_login);
-	};
-	while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
-		chop($last_ip);
-	};
-	while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
-		chop($email);
-	};
-	while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
-		chop($memo);
-	};
-
-	if (length($name) == 0 || $name eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
-		} else {
-			print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
-		}
-		return 123;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Le compte [id: $id2] a les caractéristiques suivantes:\n";
-		} else {
-			print "The account [id: $id2] is set with:\n";
-		}
-		if ($GM_level == 0) {
-			print " Id:     $id2 (non-GM)\n";
-		} else {
-			if ($defaultlanguage eq "F") {
-				print " Id:     $id2 (GM niveau $GM_level)\n";
-			} else {
-				print " Id:     $id2 (GM level $GM_level)\n";
-			}
-		}
-		if ($defaultlanguage eq "F") {
-			print " Nom:    '$name'\n";
-			print " Sexe:   ".("Femme", "Male", "Serveur")[$sex]."\n";
-		} else {
-			print " Name:   '$name'\n";
-			print " Sex:    ".("Female", "Male", "Server")[$sex]."\n";
-		}
-		print " E-mail: $email\n";
-		if ($status == 7) {
-			print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
-		} else {
-			print " Statut: $status [".(
-			      ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
-			      "Unregistered ID",
-			      "Incorrect Password",
-			      "This ID is expired",
-			      "Rejected from Server",
-			      "You have been blocked by the GM Team",
-			      "Your Game's EXE file is not the latest version",
-			      "You are Prohibited to log in until %s",
-			      "Server is jammed due to over populated",
-			      "No MSG",
-			      "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
-		}
-		if ($defaultlanguage eq "F") {
-			print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
-			print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
-			print " Dernière connexion le: $last_login (ip: $last_ip)\n";
-			print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
-		} else {
-			print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
-			print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
-			print " Last connection at: $last_login (ip: $last_ip)\n";
-			print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
-		}
-		print " Memo:   '$memo'\n";
-	}
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Check the validity of a password
-# (Note: never send back a password with login-server!! security of passwords)
-sub checkaccount() {
-	my($userid, $passwd) = @_;
-	if ($userid eq "") {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un nom de compte svp.\n";
-			print "<exemple> check testname motdepasse\n";
-		} else {
-			print "Please input an account name.\n";
-			print "<example> check testname password\n";
-		}
-		return 136;
-	}
-	if (verify_accountname($userid) == 0) {
-		return 102;
-	}
-	if ($passwd eq "") {
-		return 134 if (($passwd = typepasswd()) eq "");
-	}
-	if (verify_password($passwd) == 0) {
-		return 131;
-	}
-	print $so pack("va24a24", 0x793a, $userid,$passwd);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x793b) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 132;
-	}
-	$buf = readso(28);
-	my($id2, $name) = unpack("Va24", $buf);
-	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
-		chop($name);
-	};
-	if ($id2 == -1 || $id2 == 4294967295) {
-		if ($defaultlanguage eq "F") {
-			print "Le compte [$userid] n'existe pas ou le mot de passe est incorrect.\n";
-		} else {
-			print "The account [$userid] doesn't exist or the password is incorrect.\n";
-		}
-		return 133;
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Le mot de passe donné correspond bien au compte [$name][id: $id2].\n";
-		} else {
-			print "The proposed password is correct for the account [$name][id: $id2].\n";
-		}
-	}
-	return 130;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to login-server to reload GM configuration file
-sub reloadGM() {
-	print $so pack("v", 0x7955);
-	$so->flush();
-	if ($defaultlanguage eq "F") {
-		print "Demande de recharger le fichier de configuration des GM envoyée.\n";
-		print "Vérifiez les comptes GM actuels (après rechargement):\n";
-	} else {
-		print "Request to reload the GM configuration file sended.\n";
-		print "Check the actual GM accounts (after reloading):\n";
-	}
-	&listaccount(0, 0, 1); # 1: to list only GM
-	return 180;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Send a broadcast message
-sub sendbroadcast() {
-	my($type, $message) = @_;
-	if ($message eq "" || length($message) == 0) {
-		if ($defaultlanguage eq "F") {
-			print "Entrez un message svp.\n";
-			if ($type == 0) {
-				print "<exemple> kami un message\n";
-			} else {
-				print "<exemple> kamib un message\n";
-			}
-		} else {
-			print "Please input a message.\n";
-			if ($type == 0) {
-				print "<example> kami a message\n";
-			} else {
-				print "<example> kamib a message\n";
-			}
-		}
-		return 136;
-	}
-
-	print $so pack("vvVa".length($message), 0x794e, $type, length($message), $message);
-	$so->flush();
-	$buf = readso(2);
-	if (unpack("v", $buf) != 0x794f) {
-		if ($defaultlanguage eq "F") {
-			print "Problème de connexion au serveur (réponse incorrecte).\n";
-		} else {
-			print "Connection error to the server (incorrect answer).\n";
-		}
-		return 152;
-	}
-	$buf = readso(2);
-	my($answer) = unpack("v", $buf);
-	if ($answer == -1 || $answer == 65535) {
-		if ($defaultlanguage eq "F") {
-			print "Echec de l'envoi du message. Aucun server de char en ligne.\n";
-		} else {
-			print "Message sending failed. No online char-server.\n";
-		}
-	} else {
-		if ($defaultlanguage eq "F") {
-			print "Message transmis au server de logins avec succès.\n";
-		} else {
-			print "Message successfully sended to login-server.\n";
-		}
-	}
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Change language of displaying
-sub changelanguage() {
-	my($language) = @_;
-	if ($language eq "" || length($language) == 0) {
-		if ($defaultlanguage == 'F') {
-			printf("Entrez une langue svp.\n");
-			printf("<exemple> language english\n");
-			printf("          language français\n");
-		} else {
-			printf("Please input a language.\n");
-			printf("<example> language english\n");
-			printf("          language français\n");
-		}
-		return 136;
-	}
-
-	$language = uc(substr($language, 0, 1));
-	if ($language =~ /^[EF]$/) {
-		$defaultlanguage = $language;
-		if ($defaultlanguage == 'F') {
-			printf("Changement de la langue d'affichage en Français.\n");
-		} else {
-			printf("Displaying language changed to English.\n");
-		}
-	} else {
-		if ($defaultlanguage == 'F') {
-			printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
-		} else {
-			printf("Undefined language (possible languages: Français or English).\n");
-		}
-	}
-
-	return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: sending 'end of connection' packet
-sub quit() {
-	print $so pack("v", 0x7532);
-	$so->flush();
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Get datas from the socket
-sub readso() {
-	my($len) = shift;
-	my($buf);
-	if (read($so, $buf, $len) < $len) {
-		if ($defaultlanguage eq "F") {
-			print "Erreur de lecture sur la Socket.\n";
-		} else {
-			print "Socket read error.\n";
-		}
-		exit(3);
-	}
-	return $buf;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Input of a password
-sub typepasswd {
-	my($passwd1, $passwd2);
-	cbreak();
-	if ($defaultlanguage eq "F") {
-		print "Entrez le mot de passe > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
-		print "Ré-entrez le mot de passe > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
-	} else {
-		print "Type the password > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
-		print "Verify the password > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
-	}
-	cooked();
-	if ($passwd1 ne $passwd2) {
-		if ($defaultlanguage eq "F") {
-			print "Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n";
-		} else {
-			print "Password verification failed. Please input same password.\n";
-		}
-		return "";
-	}
-	return $passwd1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Return ordonal text of a number
-sub makeordinal {
-	my($c) = shift;
-	if ($defaultlanguage eq "F") {
-		if ($c < 1) {
-			return $c;
-		}
-		return $c.("er", "ème")[$c == 1 ? 0 : 1];
-	} else {
-		if ($c % 10 < 4 && $c % 10 != 0 && ($c < 10 || $c > 20)) {
-			return $c.("st","nd","rd")[$c % 10 - 1];
-		}
-		return $c."th";
-	}
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of an account name (return 0 if incorrect, and 1 if ok)
-sub verify_accountname {
-	my($account_name) = @_;       # Get the account_name
-	if ($account_name =~ /[\x00-\x1f]/) { # remove control char
-		my($c) = length($`) + 1;
-		if ($defaultlanguage eq "F") {
-			print "Caractère interdit trouvé dans le nom du compte (".makeordinal($c)." caractère).\n";
-		} else {
-			print "Illegal character found in the account name (".makeordinal($c)." character).\n";
-		}
-		return 0;
-	}
-	if (length($account_name) < 4) {
-		if ($defaultlanguage eq "F") {
-			print "Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n";
-		} else {
-			print "Account name is too short. Please input an account name of 4-23 bytes.\n";
-		}
-		return 0;
-	}
-	if (length($account_name) > 23) {
-		if ($defaultlanguage eq "F") {
-			print "Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n";
-		} else {
-			print "Account name is too long. Please input an account name of 4-23 bytes.\n";
-		}
-		return 0;
-	}
-	return 1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
-sub verify_password {
-	my($password) = @_;       # Get the password
-	if ($password =~ /[\x00-\x1f]/) {
-		my($c) = length($`) + 1;
-		if ($defaultlanguage eq "F") {
-			print "Caractère interdit trouvé dans le mot de passe (".makeordinal($c)." caractère).\n";
-		} else {
-			print "Illegal character found in the password (".makeordinal($c)." character).\n";
-		}
-		return 0;
-	}
-	if (length($password) < 4) {
-		if ($defaultlanguage eq "F") {
-			print "Mot de passe trop court. Entrez un mot de passe de 4-23 caractères.\n";
-		} else {
-			print "Password is too short. Please input a password of 4-23 bytes.\n";
-		}
-		return 0;
-	}
-	if (length($password) > 23) {
-		if ($defaultlanguage eq "F") {
-			print "Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n";
-		} else {
-			print "Password is too long. Please input a password of 4-23 bytes.\n";
-		}
-		return 0;
-	}
-	return 1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of an e-mail (return 0 if incorrect, and 1 if ok)
-sub verify_email {
-	my($email) = @_;       # Get the e-mail
-	# To ignore a '.' before the @ (wanadoo, a provider, do that)
-	$email =~ s/\.\@/\@/;
-	# If the e-mail is void, it's not correct -> return 0
-	if ($email eq '') {
-		return(0);
-	}
-	# If the e-mail have no "@", it's not correct -> return 0
-	if ($email !~ /\@/) {
-		return(0);
-	}
-	# If the e-mail have a ",", a space, a tab or a ";", it's not correct -> return 0
-	if ($email =~ /[\,|\s|\;]/) {
-		return(0)
-	};
-	# IF
-	#    (the e-mail contains 2 "@", or ".." or "@." or starts or finishes by a ".")
-	# OR IF
-	#    (the e-mail doesn't contain "@localhost" AND
-	# - it doesn't contain characters followed by "@" itself followed by letters itself followed by "." and 2 or more letters
-	# - or an IP address)
-	# -> so, it's not good ! (finish !)
-	if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/ ||
-		($email !~ /^.+\@localhost$/ &&
-		$email !~ /^.+\@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
-		return(0); # non-valid email
-	} else {
-		# If not, the e-email address is correct
-		return(1); # valid email
-	}
+#!/usr/bin/perl
+use POSIX;
+##########################################################################
+# EAthena login-server remote administration tool
+# New ladamin by [Yor]
+##########################################################################
+#-------------------------------INSTRUCTIONS------------------------------
+# Set the 4 variables below:
+#   IP of the login server.
+#   Port where the login-server listens incoming packets.
+#   Password of administration (same of config_athena.conf).
+#   Displayed language of the sofware (if not correct, english is used).
+# IMPORTANT:
+#   Be sure that you authorize remote administration in login-server
+#   (see login_athena.conf, 'admin_state' parameter)
+#-------------------------------------------------------------------------
+my($loginserverip) = "127.0.0.1";        # IP of login-server
+my($loginserverport) = 6900;             # Port of login-server
+my($loginserveradminpassword) = "admin"; # Administration password
+my($connecttimeout) = 10;                # Timeout of connection (in seconds)
+my($passenc) = 2;                        # Encoding type of the password
+my($defaultlanguage) = "E";              # Default language (F: Français/E: English)
+                                         # (if it's not 'F', default is English)
+
+#-------------------------------------------------------------------------
+#  LIST of COMMANDs that you can type at the prompt:
+#    To use these commands you can only type only the first letters.
+#    You must type a minimum of letters (you can not type 'a',
+#      because ladmin doesn't know if it's for 'aide' or for 'add')
+#    <Example> q <= quit, li <= list, pass <= passwd, etc.
+#
+#  Note: every time you must give a account_name, you can use "" or '' (spaces can be included)
+#
+#  aide/help/?
+#    Display the description of the commands
+#  aide/help/? [command]
+#    Display the description of the specified command
+#
+#  add <account_name> <sex> <password>
+#    Create an account with the default email (a@a.com).
+#    Concerning the sex, only the first letter is used (F or M).
+#    The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.
+#    When the password is omitted, the input is done without displaying of the pressed keys.
+#    <example> add testname Male testpass
+#
+#  ban/banish yyyy/mm/dd hh:mm:ss <account name>
+#    Changes the final date of a banishment of an account.
+#    Same command of banset, except that account_name is at end
+#
+#  banadd <account_name> <modifier>
+#    Adds or substracts time from the final date of a banishment of an account.
+#    Modifier is done as follows:
+#      Adjustment value (-1, 1, +1, etc...)
+#      Modified element:
+#        a or y: year
+#        m:  month
+#        j or d: day
+#        h:  hour
+#        mn: minute
+#        s:  second
+#    <example> banadd testname +1m-2mn1s-6y
+#              this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
+#  NOTE: If you modify the final date of a non-banished account,
+#        you fix the final date to (actual time +- adjustments)
+#
+#  banset <account_name> yyyy/mm/dd [hh:mm:ss]
+#    Changes the final date of a banishment of an account.
+#    Default time: 23:59:59
+#  banset <account_name> 0
+#    Set a non-banished account (0 = unbanished).
+#
+#  block <account name>
+#    Set state 5 (You have been blocked by the GM Team) to an account.
+#    Same command of state <account_name> 5.
+#
+#  check <account_name> <password>
+#    Check the validity of a password for an account
+#    NOTE: Server will never sends back a password.
+#          It's the only method you have to know if a password is correct.
+#          The other method is to have a ('physical') access to the accounts file.
+#
+#  create <account_name> <sex> <email> <password>
+#    Like the 'add' command, but with e-mail moreover.
+#    <example> create testname Male my@mail.com testpass
+#
+#  del <account name>
+#    Remove an account.
+#    This order requires confirmation. After confirmation, the account is deleted.
+#
+#  email <account_name> <email>
+#    Modify the e-mail of an account.
+#
+#  getcount
+#    Give the number of players online on all char-servers.
+#
+#  gm <account_name> [GM_level]
+#    Modify the GM level of an account.
+#    Default value remove GM level (GM level = 0).
+#    <example> gm testname 80
+#
+#  id <account name>
+#    Give the id of an account.
+#
+#  info <account_id>
+#    Display complete information of an account.
+#
+#  kami <message>
+#    Sends a broadcast message on all map-server (in yellow).
+#  kamib <message>
+#    Sends a broadcast message on all map-server (in blue).
+#
+#  language <language>
+#    Change the language of displaying.
+#
+#  list/ls [start_id [end_id]]
+#    Display a list of accounts.
+#    'start_id', 'end_id': indicate end and start identifiers.
+#    Research by name is not possible with this command.
+#    <example> list 10 9999999
+#
+#  listBan/lsBan [start_id [end_id]]
+#    Like list/ls, but only for accounts with state or banished
+#
+#  listGM/lsGM [start_id [end_id]]
+#    Like list/ls, but only for GM accounts
+#
+#  listOK/lsOK [start_id [end_id]]
+#    Like list/ls, but only for accounts without state and not banished
+#
+#  memo <account_name> <memo>
+#    Modify the memo of an account.
+#    'memo': it can have until 253 characters (with spaces or not).
+#
+#  name <account_id>
+#    Give the name of an account.
+#
+#  passwd <account_name> <new_password>
+#    Change the password of an account.
+#    When new password is omitted, the input is done without displaying of the pressed keys.
+#
+#  quit/end/exit
+#    End of the program of administration
+#
+#  reloadGM
+#    Reload GM configuration file
+#
+#  search <expression>
+#    Seek accounts.
+#    Displays the accounts whose names correspond.
+#  search -r/-e/--expr/--regex <expression>
+#    Seek accounts by regular expression.
+#    Displays the accounts whose names correspond.
+#
+#  sex <account_name> <sex>
+#    Modify the sex of an account.
+#    <example> sex testname Male
+#
+#  state <account_name> <new_state> <error_message_#7>
+#    Change the state of an account.
+#    'new_state': state is the state of the packet 0x006a + 1. The possibilities are:
+#                 0 = Account ok            6 = Your Game's EXE file is not the latest version
+#                 1 = Unregistered ID       7 = You are Prohibited to log in until %s
+#                 2 = Incorrect Password    8 = Server is jammed due to over populated
+#                 3 = This ID is expired    9 = No MSG
+#                 4 = Rejected from Server  100 = This ID has been totally erased
+#                 5 = You have been blocked by the GM Team
+#                 all other values are 'No MSG', then use state 9 please.
+#    'error_message_#7': message of the code error 6 = Your are Prohibited to log in until %s (packet 0x006a)
+#
+#  timeadd <account_name> <modifier>
+#    Adds or substracts time from the validity limit of an account.
+#    Modifier is done as follows:
+#      Adjustment value (-1, 1, +1, etc...)
+#      Modified element:
+#        a or y: year
+#        m:  month
+#        j or d: day
+#        h:  hour
+#        mn: minute
+#        s:  second
+#    <example> timeadd testname +1m-2mn1s-6y
+#              this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
+#  NOTE: You can not modify a unlimited validity limit.
+#        If you want modify it, you want probably create a limited validity limit.
+#        So, at first, you must set the validity limit to a date/time.
+#
+#  timeset <account_name> yyyy/mm/dd [hh:mm:ss]
+#    Changes the validity limit of an account.
+#    Default time: 23:59:59
+#  timeset <account_name> 0
+#    Gives an unlimited validity limit (0 = unlimited).
+#
+#  unban/unbanish <account name>
+#    Unban an account.
+#    Same command of banset 0.
+#
+#  unblock <account name>
+#    Set state 0 (Account ok) to an account.
+#    Same command of state <account_name> 0.
+#
+#  version
+#    Display the version of the login-server.
+#
+#  who <account name>
+#    Displays complete information of an account.
+#
+#-------------------------------------------------------------------------
+# Possibilities to execute ladmin in command line by usage of the software with a parameter:
+# ./ladmin --mode param1 ...
+#
+#  --makesymlink                                    -- Create the symbolic links for a use in shell
+#  --add <account_name> <sex> <password>            -- Create an account with the default email (or -a)
+#  --ban yyyy/mm/dd hh:mm:ss <account_name>         -- Change the final date of a banishment of an account (or -b)
+#  --banadd <account_name> <modifier>               -- Add or substract time from the final date of a banishment of an account (or - ba)
+#  --banset <account_name> yyyy/mm/dd [hh:mm:ss]    -- Change the final date of a banishment of an account (or -bs)
+#  --banset <account_name> 0                        -- Unbanish an account (or -bs)
+#  --block <account_name>                           -- Set state 5 to an account (or -bl)
+#  --check <account_name> <password>                -- Check the validity of a password for an account (or -check)
+#  --create <account_name> <sex> <email> <password> -- Create an account with email (or -c)
+#  --del <account_name>                             -- Remove an account (or -d)
+#  --email <account_name> <email>                   -- Modify an email of an account (or -e)
+#  --getcount                                       -- Give the number of players online on all char-servers (or -g)
+#  --gm <account_name> <GM_level>                   -- Change the GM level of an account (or -gm)
+#  --id <account_name>                              -- Give the id of an account (or -i)
+#  --info <account_id>                              -- Display complete information of an account (or -info)
+#  --kami <message>                                 -- Sends a broadcast message on all map-server (in yellow).
+#  --kamib <message>                                -- Sends a broadcast message on all map-server (in blue).
+#  --language <language>                            -- Change the language of displaying (-lang).
+#  --list [First_id [Last_id]]                      -- Display a list of accounts (or -l)
+#  --listBan [start_id [end_id]]                    -- Display a list of accounts with state or banished (or -lBan)
+#  --listGM [First_id [Last_id]]                    -- Display a list of GM accounts (or -lGM)
+#  --listOK [start_id [end_id]]                     -- Display a list of accounts without state and not banished (or -lOK)
+#  --memo <account_name> <memo>                     -- Modify the memo of an account (or -e)
+#  --name <account_id>                              -- Give the name of an account (or -n)
+#  --passwd <account_name> <new_password>           -- Change the password of an account (or -p)
+#  --reloadGM                                       -- Reload GM configuration file (or -r)
+#  --search <expression>                            -- Seek accounts (or -s)
+#  --search -e/-r/--expr/--regex <expression>       -- Seek accounts by REGEX (or -s)
+#  --sex <account_name> <sex>                       -- Change the sex of an account (or -sex)
+#  --state <account_name> <new_state> <error_message_#7> -- Change the state of an account (or -t)
+#  --timeadd <account_name> <modifier>              -- Add or substract time from the validity limit of an account (or - ta)
+#  --timeset <account_name> yyyy/mm/dd [hh:mm:ss]   -- Change the validify limit of an account (or -ts)
+#  --timeset <account_name> 0                       -- Give a unlimited validity limit (or -ts)
+#  --unban/unbanish <account_name>                  -- Unban an account (or -uba)
+#  --unblock <account_name>                         -- Set state 0 to an account (or -ubl)
+#  --version                                        -- Display the version of the login-server (or -v)
+#  --who <account_name>                             -- Display complete information of an account (or -w)
+#
+#  <example> ./ladmin --addaccount testname Male testpass
+#
+#-------------------------------------------------------------------------
+# Possibilities to execute ladmin with symbolic links in Shell
+# To create the symbolic links, execute ladmin with the '-- makesymlink' option.
+#
+#  addaccount <account_name> <sex> <password>            -- Create an account with the default email
+#  banaccount yyyy/mm/dd hh:mm:ss <account_name>         -- Change the final date of a banishment of an account
+#  banaddaccount <account_name> <modifier>               -- Add or substract time from the final date of a banishment of an account
+#  bansetaccount <account_name> yyyy/mm/dd [hh:mm:ss]    -- Change the final date of a banishment of an account
+#  bansetaccount <account_name> 0                        -- Unbanish an account
+#  blockaccount <account_name>                           -- Set state 5 (blocked by the GM Team) to an account
+#  checkaccount <account_name> <password>                -- Check the validity of a password for an account
+#  createaccount <account_name> <sex> <email> <password> -- Create an account with email
+#  delaccount <account_name>                             -- Remove an account
+#  emailaccount <account_name> <email>                   -- Modify an email of an account
+#  getcount                                              -- Give the number of players online on all char-servers
+#  gmaccount <account_name> <GM_level>                   -- Change the GM level of an account
+#  idaccount <account_name>                              -- Give the id of an account
+#  infoaccount <account_id>                              -- Display complete information of an account
+#  kami <message>                                        -- Sends a broadcast message on all map-server (in yellow).
+#  kamib <message>                                       -- Sends a broadcast message on all map-server (in blue).
+#  ladminlanguage <language>                             -- Change the language of displaying.
+#  listaccount [First_id [Last_id]]                      -- Display a list of accounts
+#  listBanaccount [start_id [end_id]]                    -- Display a list of accounts with state or banished
+#  listGMaccount [First_id [Last_id]]                    -- Display a list of GM accounts
+#  listOKaccount [start_id [end_id]]                     -- Display a list of accounts without state and not banished
+#  loginserverversion                                    -- Display the version of the login-server
+#  memoaccount <account_name> <memo>                     -- Modify the memo of an account
+#  nameaccount <account_id>                              -- Give the name of an account
+#  passwdaccount <account_name> <new_password>           -- Change the password of an account
+#  reloadGM                                              -- Reload GM configuration file
+#  searchaccount <expression>                            -- Seek accounts
+#  searchaccount -e/-r/--expr/--regex <expression>       -- Seek accounts by REGEX
+#  sexaccount <account_name> <sex>                       -- Change the sex of an account (or -sex)
+#  stateaccount <account_name> <new_state> <error_message_#7> -- Change the state of an account
+#  timeaddaccount <account_name> <modifier>              -- Add or substract time from the validity limit of an account
+#  timesetaccount <account_name> yyyy/mm/dd [hh:mm:ss]   -- Change the validify limit of an account
+#  timesetaccount <account_name> 0                       -- Give a unlimited validity limit
+#  unbanaccount <account_name>                           -- Unban an account
+#  unblockaccount <account_name>                         -- Set state 0 (Account ok) to an account
+#  whoaccount <account_name>                             -- Display complete information of an account
+#  <exemple> ./addaccount testname Male testpass
+#
+#-------------------------------------------------------------------------
+# About the encoding:
+#
+#   The Digest::MD5 module is necessary to use the encrypted password system.
+#   When the software cannot found the Digest::MD5 module,
+#     encoding is automatically disabled ($passenc=0), which allows
+#     to use this program in any cases.
+#
+#-------------------------------------------------------------------------
+# How to use ladmin with UNIX:
+#
+# You excecute ladmin as a standard command.
+#  <Example of preparation to have an access to ladmin>
+#    $ mv ladmin ladmin_org
+#    $ nkf -eLu ladmin_org > ladmin
+#    $ chmod 700 ladmin
+#  <Example to start directly ladmin>
+#    $ perl ladmin
+#
+##########################################################################
+
+
+use strict;
+use IO::Socket;
+use Term::ReadLine;
+eval { use POSIX qw(:termios_h); };
+eval { use Digest::MD5 qw(md5); } if $passenc;
+$passenc = 0 if($@);
+
+my($ver) = "1.00";
+
+# Start of termios
+my($termios, $orgterml, $termlecho, $termlnoecho) = ();
+eval{
+	$termios = POSIX::Termios->new();
+	$termios->getattr(fileno(STDIN));
+	$orgterml = $termios->getlflag();
+	$termlecho = ECHO | ECHOK | ICANON;
+	$termlnoecho = $orgterml & ~$termlecho;
+};
+
+# Modification of termios for the displaying of passwords (no displays for pressed keys)
+sub cbreak() {
+	if ($termios) {
+		$termios->setlflag($termlnoecho);
+		$termios->setcc(VTIME, 1);
+		$termios->setattr(fileno(STDIN), TCSANOW);
+	}
+}
+# Modification of termios to return at the normal displaying (after input of the passwords)
+sub cooked() {
+	if ($termios) {
+		$termios->setlflag($orgterml);
+		$termios->setcc(VTIME,0);
+		$termios->setattr(fileno(STDIN),TCSANOW);
+	}
+}
+END{ cooked() }
+
+if ($defaultlanguage eq "F") {
+	print "Outil d'administration à distance de eAthena V.$ver\n";
+} else {
+	print "EAthena login-server administration tool V.$ver\n";
+}
+
+# Creation of the symbolic links for call of the program in line command of the shell
+if ($ARGV[0] eq "--makesymlink") {
+	symlink $0, "loginserverversion";
+	symlink $0, "addaccount";
+	symlink $0, "banaccount";
+	symlink $0, "banaddaccount";
+	symlink $0, "bansetaccount";
+	symlink $0, "blockaccount";
+	symlink $0, "checkaccount";
+	symlink $0, "createaccount";
+	symlink $0, "delaccount";
+	symlink $0, "emailaccount";
+	symlink $0, "getcount";
+	symlink $0, "gmaccount";
+	symlink $0, "idaccount";
+	symlink $0, "infoaccount";
+	symlink $0, "kami";
+	symlink $0, "kamib";
+	symlink $0, "ladminlanguage";
+	symlink $0, "listaccount";
+	symlink $0, "listBanaccount";
+	symlink $0, "listGMaccount";
+	symlink $0, "listOKaccount";
+	symlink $0, "memoaccount";
+	symlink $0, "nameaccount";
+	symlink $0, "passwdaccount";
+	symlink $0, "reloadGM";
+	symlink $0, "searchaccount";
+	symlink $0, "sexaccount";
+	symlink $0, "stateaccount";
+	symlink $0, "timeaddaccount";
+	symlink $0, "timesetaccount";
+	symlink $0, "unbanaccount";
+	symlink $0, "unblockaccount";
+	symlink $0, "whoaccount";
+	if ($defaultlanguage eq "F") {
+		print "Liens symbliques créés.\n";
+	} else {
+		print "Symbolic links created.\n";
+	}
+	exit(0);
+}
+
+# Connection to the login-server
+my($so,$er) = ();
+eval{
+	$so = IO::Socket::INET->new(
+		PeerAddr=> $loginserverip,
+		PeerPort=> $loginserverport,
+#		Proto   => "tcp",
+		Timeout => $connecttimeout) or $er = 1;
+};
+if ($er || $@) {
+	if ($defaultlanguage eq "F") {
+		print "\nImpossible de se connecter au serveur de login [${loginserverip}:$loginserverport] !\n";
+	} else {
+		print "\nImpossible to have a connection with the login-server [${loginserverip}:$loginserverport] !\n";
+	}
+	print "$!\n";	# Displaying of the error
+	exit(2);
+}
+
+# Sending the administration password
+if ($passenc == 0) {
+	print $so pack("v2a24",0x7918,0,$loginserveradminpassword);
+	$so->flush();
+} else {
+	print $so pack("v",0x791a);
+	$so->flush();
+	my($buf) = readso(4);
+	if (unpack("v",$buf) != 0x01dc) {
+		if ($defaultlanguage eq "F") {
+			print "Erreur au login (échec de la création de la clef md5).\n";
+		} else {
+			print "Error at login (failure of the md5 key creation).\n";
+		}
+	}
+	$buf = readso(unpack("x2v",$buf)-4);
+	my($md5bin) = md5(($passenc == 1) ? $buf.$loginserveradminpassword : $loginserveradminpassword.$buf);
+	print $so pack("v2a16",0x7918,$passenc,$md5bin);
+	$so->flush();
+}
+
+# Waiting of the server reply
+my($buf) = readso(3);
+
+if (unpack("v",$buf) != 0x7919 || unpack("x2c",$buf) != 0) {
+	if ($defaultlanguage eq "F") {
+		print "Erreur de login:\n";
+		print " - mot de passe incorrect,\n";
+		print " - système d'administration non activé, ou\n";
+		print " - IP non autorisée.\n";
+	} else {
+		print "Error at login:\n";
+		print " - incorrect password,\n";
+		print " - administration system not activated, or\n";
+		print " - unauthorised IP.\n";
+	}
+	quit();
+	exit(4);
+}
+
+if ($defaultlanguage eq "F") {
+	print "Connexion établie.\n";
+} else {
+	print "Established connection.\n";
+}
+
+#-------------------------------------------------------------------------
+# Here are checked the command lines with arguments and symbolic links (no prompt)
+
+if ($0 =~ /addaccount$/ ||
+    (($ARGV[0] eq "-a" || $ARGV[0] eq "--add") && ((shift @ARGV), 1))) {
+	my($r) = addaccount($ARGV[0], $ARGV[1], $ARGV[2]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /banaccount$/ || $0 =~ /banishaccount$/ ||
+         (($ARGV[0] eq "-b" || $ARGV[0] eq "--ban" || $ARGV[0] eq "--banish") && ((shift @ARGV), 1))) {
+	my($r) = bansetaccount($ARGV[1], $ARGV[2], $ARGV[0]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /banaddaccount$/ ||
+         (($ARGV[0] eq "-ba" || $ARGV[0] eq "--banadd") && ((shift @ARGV), 1))) {
+	my($r) = banaddaccount($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /bansetaccount$/ ||
+         (($ARGV[0] eq "-bs" || $ARGV[0] eq "--banset") && ((shift @ARGV), 1))) {
+	my($r) = bansetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /blockaccount$/ ||
+         (($ARGV[0] eq "-bl" || $ARGV[0] eq "--block") && ((shift @ARGV), 1))) {
+	my($r) = changestate($ARGV[0], 5, "");
+	quit();
+	exit($r);
+} elsif ($0 =~ /checkaccount$/ ||
+         (($ARGV[0] eq "-check" || $ARGV[0] eq "--check") && ((shift @ARGV), 1))) {
+	my($r) = checkaccount($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /createaccount$/ ||
+         (($ARGV[0] eq "-c" || $ARGV[0] eq "--create") && ((shift @ARGV), 1))) {
+	my($r) = createaccount($ARGV[0], $ARGV[1], $ARGV[2], $ARGV[3]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /delaccount$/ ||
+         (($ARGV[0] eq "-d" || $ARGV[0] eq "--del") && ((shift @ARGV), 1))) {
+	my($r) = delaccount($ARGV[0]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /emailaccount$/ ||
+         (($ARGV[0] eq "-e" || $ARGV[0] eq "--email") && ((shift @ARGV), 1))) {
+	my($r) = changeemail($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /getcount$/ ||
+         (($ARGV[0] eq "-g" || $ARGV[0] eq "--getcount") && ((shift @ARGV), 1))) {
+	my($r) = getlogincount();
+	quit();
+	exit($r);
+} elsif ($0 =~ /gmaccount$/ ||
+         (($ARGV[0] eq "-gm" || $ARGV[0] eq "--gm") && ((shift @ARGV), 1))) {
+	my($r) = changegmlevel($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /id$/ ||
+         (($ARGV[0] eq "-i" || $ARGV[0] eq "--id") && ((shift @ARGV), 1))) {
+	my($r) = idaccount($ARGV[0]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /infoaccount$/ ||
+         (($ARGV[0] eq "-info" || $ARGV[0] eq "--info") && ((shift @ARGV), 1))) {
+	my($r) = infoaccount($ARGV[0]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /kami$/ ||
+         (($ARGV[0] eq "-kami" || $ARGV[0] eq "--kami") && ((shift @ARGV), 1))) {
+	my($r) = sendbroadcast(0, $ARGV[0]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /kamib$/ ||
+         (($ARGV[0] eq "-kamib" || $ARGV[0] eq "--kamib") && ((shift @ARGV), 1))) {
+	my($r) = sendbroadcast(0x10, $ARGV[0]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /ladminlanguage$/ ||
+         (($ARGV[0] eq "-lang" || $ARGV[0] eq "--language") && ((shift @ARGV), 1))) {
+	my($r) = changelanguage($ARGV[0]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /listaccount$/ ||
+         (($ARGV[0] eq "-l" || $ARGV[0] eq "--list") && ((shift @ARGV), 1))) {
+	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 0); # 0: to list all
+	quit();
+	exit($r);
+} elsif ($0 =~ /listBanaccount$/ ||
+         (($ARGV[0] eq "-lBan" || $ARGV[0] eq "--listBan") && ((shift @ARGV), 1))) {
+	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 3); # 3: to list only accounts with state or banished
+	quit();
+	exit($r);
+} elsif ($0 =~ /listGMaccount$/ ||
+         (($ARGV[0] eq "-lGM" || $ARGV[0] eq "--listGM") && ((shift @ARGV), 1))) {
+	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 1); # 1: to list only GM
+	quit();
+	exit($r);
+} elsif ($0 =~ /listOKaccount$/ ||
+         (($ARGV[0] eq "-lOK" || $ARGV[0] eq "--listOK") && ((shift @ARGV), 1))) {
+	my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 4); # 4: to list only accounts without state and not banished
+	quit();
+	exit($r);
+} elsif ($0 =~ /loginserverversion$/ ||
+         (($ARGV[0] eq "-v" || $ARGV[0] eq "--version") && ((shift @ARGV), 1))) {
+	my($r) = checkloginversion();
+	quit();
+	exit($r);
+} elsif ($0 =~ /memoaccount$/ ||
+         (($ARGV[0] eq "-m" || $ARGV[0] eq "--memo") && ((shift @ARGV), 1))) {
+	my($r) = changememo($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /nameaccount$/ ||
+         (($ARGV[0] eq "-n" || $ARGV[0] eq "--name") && ((shift @ARGV), 1))) {
+	my($r) = nameaccount(int($ARGV[0]));
+	quit();
+	exit($r);
+} elsif ($0 =~ /passwdaccount$/ ||
+         (($ARGV[0] eq "-p" || $ARGV[0] eq "--passwd") && ((shift @ARGV), 1))) {
+	my($r) = changepasswd($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /reloadGM$/ ||
+         (($ARGV[0] eq "-r" || $ARGV[0] eq "--reloadGM") && ((shift @ARGV), 1))) {
+	my($r) = reloadGM();
+	quit();
+	exit($r);
+} elsif ($0 =~ /searchaccount$/ ||
+         (($ARGV[0] eq "-s" || $ARGV[0] eq "--search") && ((shift @ARGV), 1))) {
+	my($r) = searchaccount($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /sexaccount$/ ||
+         (($ARGV[0] eq "-sex" || $ARGV[0] eq "--sex") && ((shift @ARGV), 1))) {
+	my($r) = changesex($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /stateaccount$/ ||
+         (($ARGV[0] eq "-t" || $ARGV[0] eq "--state") && ((shift @ARGV), 1))) {
+	my($r) = changestate($ARGV[0], $ARGV[1], $ARGV[2]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /timeaddaccount$/ ||
+         (($ARGV[0] eq "-ta" || $ARGV[0] eq "--timeadd") && ((shift @ARGV), 1))) {
+	my($r) = timeaddaccount($ARGV[0], $ARGV[1]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /timesetaccount$/ ||
+         (($ARGV[0] eq "-ts" || $ARGV[0] eq "--timeset") && ((shift @ARGV), 1))) {
+	my($r) = timesetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
+	quit();
+	exit($r);
+} elsif ($0 =~ /unbanaccount$/ || $0 =~ /unbanishaccount$/ ||
+         (($ARGV[0] eq "-uba" || $ARGV[0] eq "--unban" || $ARGV[0] eq "--unbanish") && ((shift @ARGV), 1))) {
+	my($r) = bansetaccount($ARGV[0], 0, "");
+	quit();
+	exit($r);
+} elsif ($0 =~ /unblockaccount$/ ||
+         (($ARGV[0] eq "-ubl" || $ARGV[0] eq "--unblock") && ((shift @ARGV), 1))) {
+	my($r) = changestate($ARGV[0], 0, "");
+	quit();
+	exit($r);
+} elsif ($0 =~ /whoaccount$/ ||
+         (($ARGV[0] eq "-w" || $ARGV[0] eq "--who") && ((shift @ARGV), 1))) {
+	my($r) = whoaccount($ARGV[0]);
+	quit();
+	exit($r);
+}
+
+#-------------------------------------------------------------------------
+if ($defaultlanguage eq "F") {
+	print "Lecture de la version du serveur de login...\n";
+} else {
+	print "Reading of the version of the login-server...\n";
+}
+checkloginversion();
+
+# Set the prompt line
+my($term) = new Term::ReadLine "ladmin";
+
+# Here begin the infinite loop to read prompts
+while(1) {
+	# Displaying of the prompt
+	print "\n";
+	if ($defaultlanguage eq "F") {
+		printf "\033[32mPour afficher les commandes, tapez 'Entrée'.\033[0m\n";
+	} else {
+		printf "\033[32mTo list the commands, type 'enter'.\033[0m\n";
+	}
+	my($cmd) = $term->readline("ladmin> ");
+	# split and recovery of the input
+	chomp $cmd; # remove cariage return
+	$cmd =~ s/\x1b\[\d*\w//g; # remove (esc)[(number)(1alpha) = screen control sequence
+	$cmd =~ s/[\x00-\x1f]//g; # remove control char
+	my($command, $parameters) = split /\s+/,$cmd,2; # extract command and parameters
+	$command = lc($command); # command in lowercase
+	my(@paramlist) = split /\s+/,$parameters; # get list of parameters
+
+	if ($command eq "?" || $command eq "") {
+		$command = "aide" if ($defaultlanguage eq "F");
+		$command = "help" if ($defaultlanguage ne "F");
+	}
+
+	# Analyse of the command
+	eval {
+# help
+		if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+			displayhelp("aide", $paramlist[0]);
+		} elsif ("help" =~ /^\Q$command/) {
+			displayhelp("help", $paramlist[0]);
+
+# general commands
+		} elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(.*)/)) {
+				addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(.*)/)) {
+				addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
+			}
+
+		} elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
+			if (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+"(.*)"/)) { # yyyy/mm/dd hh:mm:ss <account_name>
+				bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+'(.*)'/)) { # yyyy/mm/dd hh:mm:ss <account_name>
+				bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} else {
+				@paramlist = split /\s+/,$parameters,3; # yyyy/mm/dd hh:mm:ss <account_name>
+				bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			}
+
+		} elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+			}
+
+		} elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
+				bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
+				bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			}
+
+		} elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
+			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
+			} else {
+				@paramlist = split /\s+/,$parameters,1;
+				changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
+			}
+
+		} elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
+				checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				checkaccount($paramlist[0], ""); # <account_name> <password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
+				checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				checkaccount($paramlist[0], ""); # <account_name> <password>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
+			}
+
+		} elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)\s+(.*)/)) {
+				createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
+				createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)\s+(.*)/)) {
+				createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
+				createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
+			}
+
+		} elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
+			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				delaccount($paramlist[0]); # <account_name>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				delaccount($paramlist[0]); # <account_name>
+			} else {
+				@paramlist = split /\s+/,$parameters,1;
+				delaccount($paramlist[0]); # <account_name>
+			}
+
+		} elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
+			}
+
+		} elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+			getlogincount();
+
+		} elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
+			}
+
+		} elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				idaccount($paramlist[0]); # <account_name>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				idaccount($paramlist[0]); # <account_name>
+			} else {
+				@paramlist = split /\s+/,$parameters,1;
+				idaccount($paramlist[0]); # <account_name>
+			}
+
+		} elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+			infoaccount(int($paramlist[0])); # <account_id>
+
+		} elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
+			@paramlist = split /\s+/,$parameters,1;
+			sendbroadcast(0, $paramlist[0]); # <type> <message>
+
+		} elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
+			@paramlist = split /\s+/,$parameters,1;
+			sendbroadcast(0x10, $paramlist[0]); # <type> <message>
+
+		} elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+			changelanguage($paramlist[0]); # <language>
+
+		} elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+			listaccount(int($paramlist[0]), int($paramlist[1]), 0); # [start_id [end_id]] 0: to list all
+
+		} elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
+			listaccount(int($paramlist[0]), int($paramlist[1]), 3); # [start_id [end_id]] 3: to list only accounts with state or banished
+
+		} elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
+			listaccount(int($paramlist[0]), int($paramlist[1]), 1); # [start_id [end_id]] 1: to list only GM
+
+		} elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
+			listaccount(int($paramlist[0]), int($paramlist[1]), 4); # [start_id [end_id]] 4: to list only accounts without state and not banished
+
+		} elsif ("memo" =~ /^\Q$command/) {
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
+				changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
+				changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
+			} else {
+				@paramlist = split /\s+/,$parameters,2;
+				changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
+			}
+
+		} elsif ("name" =~ /^\Q$command/) {
+			nameaccount(int($paramlist[0])); # <account_id>
+
+		} elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
+				changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				changepasswd($paramlist[0], ""); # <account_name> <new_password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
+				changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				changepasswd($paramlist[0], ""); # <account_name> <new_password>
+			} else {
+				@paramlist = split /\s+/,$parameters,2;
+				changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
+			}
+
+		} elsif ("reloadgm" =~ /^\Q$command/) {
+			reloadGM();
+
+		} elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+			if (@paramlist = ($parameters =~ m/^(-{1,2}[re]\S*)\s+(.*)/)) {
+				searchaccount($paramlist[0], $paramlist[1]); # -r/-e/--expr/--regex <expression> | <expression>
+			} else {
+				@paramlist = split /\s+/,$parameters,1;
+				searchaccount($paramlist[0], ""); # -r/-e/--expr/--regex <expression> | <expression>
+			}
+
+		} elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
+			}
+
+		} elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)\s+(.*)/)) {
+				changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)/)) {
+				changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)\s+(.*)/)) {
+				changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)/)) {
+				changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
+			} else {
+				@paramlist = split /\s+/,$parameters,3;
+				changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
+			}
+
+		} elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+			}
+
+		} elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+			if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
+				timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+				timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
+				timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+				timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} else {
+				@paramlist = split /\s+/,$parameters;
+				timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			}
+
+		} elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
+			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			} else {
+				@paramlist = split /\s+/,$parameters,1;
+				bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
+			}
+
+		} elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
+			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
+			} else {
+				@paramlist = split /\s+/,$parameters,1;
+				changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
+			}
+
+		} elsif ("version" =~ /^\Q$command/) {
+			checkloginversion();
+
+		} elsif ("who" =~ /^\Q$command/) {
+			if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+				whoaccount($paramlist[0]); # <account_name>
+			} elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+				whoaccount($paramlist[0]); # <account_name>
+			} else {
+				@paramlist = split /\s+/,$parameters,1;
+				whoaccount($paramlist[0]); # <account_name>
+			}
+
+# quit
+		} elsif ("quit" =~ /^\Q$command/ ||
+		         (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?
+			last;
+
+# unknown command
+		} elsif ($command) {
+			if ($defaultlanguage eq "F") {
+				print "Commande inconnue [".$command."]\n";
+			} else {
+				print "Unknown command [".$command."]\n";
+			}
+		}
+#		$term->addhistory($cmd) if $command;
+	};
+	if ($@) {
+		if ($defaultlanguage eq "F") {
+			print "Erreur [".$command."]\n$@";
+		} else {
+			print "Error [".$command."]\n$@";
+		}
+	}
+};
+
+# End of the software
+quit();
+
+if ($defaultlanguage eq "F") {
+	print "Au revoir.\n";
+} else {
+	print "Bye.\n";
+}
+exit(0);
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the version of the login-server
+sub checkloginversion() {
+	print $so pack("v",30000); # 0x7530
+	$so->flush();
+	$buf = readso(10);
+	# Analyse du Packet
+	my($ret, $maver, $miver, $rev, $dev, $mod, $type, $mdver) = unpack("vc6v", $buf);
+	if ($ret != 30001) { #0x7531
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		exit(6);
+	}
+
+	print "  Login-Server [$loginserverip:$loginserverport]\n";
+	printf "  eAthena version %s-%d.%d", ("stable", "dev")[$dev], $maver, $miver;
+	printf " revision %d", $rev if $rev;
+	printf "%s%d.\n", ("", "-mod")[$mod], $mdver;
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the help
+sub displayhelp() {
+	my($help, $receivedcommand) = @_;
+
+	my($command) = lc($receivedcommand); # command in lowercase
+
+	if ($command eq "") {
+		$command = "not a command"; # any value that is not a command
+	}
+
+	if ($command eq "?") {
+		$command = "aide" if ($defaultlanguage eq "F");
+		$command = "help" if ($defaultlanguage ne "F");
+	}
+
+	if ($help eq "aide") {
+		if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+			printf "aide/help/?\n";
+			printf "  Affiche la description des commandes\n";
+			printf "aide/help/? [commande]\n";
+			printf "  Affiche la description de la commande specifiée\n";
+		} elsif ("help" =~ /^\Q$command/) {
+			printf "aide/help/?\n";
+			printf "  Display the description of the commands\n";
+			printf "aide/help/? [command]\n";
+			printf "  Display the description of the specified command\n";
+		} elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+			printf "add <nomcompte> <sexe> <motdepasse>\n";
+			printf "  Crée un compte avec l'email par défaut (a\@a.com).\n";
+			printf "  Concernant le sexe, seule la première lettre compte (F ou M).\n";
+			printf "  L'e-mail est a\@a.com (e-mail par défaut). C'est comme n'avoir aucun e-mail.\n";
+			printf "  Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n";
+			printf "  <exemple> add testname Male testpass\n";
+		} elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
+			printf "ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>\n";
+			printf "  Change la date de fin de bannissement d'un compte.\n";
+			printf "  La différence avec banset est la position du nom du compte.\n";
+		} elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+			printf "banadd <nomcompte> <Modificateur>\n";
+			printf "  Ajoute ou soustrait du temps à la date de banissement d'un compte.\n";
+			printf "  Les modificateurs sont construits comme suit:\n";
+			printf "    Valeur d'ajustement (-1, 1, +1, etc...)\n";
+			printf "    Elément modifié:\n";
+			printf "      a ou y: année\n";
+			printf "      m:      mois\n";
+			printf "      j ou d: jour\n";
+			printf "      h:      heure\n";
+			printf "      mn:     minute\n";
+			printf "      s:      seconde\n";
+			printf "  <exemple> banadd testname +1m-2mn1s-6a\n";
+			printf "            Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n";
+			printf "            et 6 ans dans le même temps.\n";
+			printf "NOTE: Si vous modifez la date de banissement d'un compte non bani,\n";
+			printf "      vous indiquez comme date (le moment actuel +- les ajustements)\n";
+		} elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+			printf "banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n";
+			printf "  Change la date de fin de bannissement d'un compte.\n";
+			printf "  Heure par défaut: 23:59:59\n";
+			printf "banset <nomcompte> 0\n";
+			printf "  Débanni un compte (0 = de-banni).\n";
+		} elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
+			printf "block <nom compte>\n";
+			printf "  Place le status d'un compte à 5 (You have been blocked by the GM Team).\n";
+			printf "  La commande est l'équivalent de state <nom_compte> 5.\n";
+		} elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+			printf "check <nomcompte> <motdepasse>\n";
+			printf "  Vérifie la validité d'un mot de passe pour un compte\n";
+			printf "  NOTE: Le serveur n'enverra jamais un mot de passe.\n";
+			printf "        C'est la seule méthode que vous possédez pour savoir\n";
+			printf "        si un mot de passe est le bon. L'autre méthode est\n";
+			printf "        d'avoir un accès ('physique') au fichier des comptes.\n";
+		} elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+			printf "create <nomcompte> <sexe> <email> <motdepasse>\n";
+			printf "  Comme la commande add, mais avec l'e-mail en plus.\n";
+			printf "  <exemple> create testname Male mon\@mail.com testpass\n";
+		} elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
+			printf "del <nomcompte>\n";
+			printf "  Supprime un compte.\n";
+			printf "  La commande demande confirmation. Après confirmation, le compte est détruit.\n";
+		} elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
+			printf "email <nomcompte> <email>\n";
+			printf "  Modifie l'e-mail d'un compte.\n";
+		} elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+			printf "getcount\n";
+			printf "  Donne le nombre de joueurs en ligne par serveur de char.\n";
+		} elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+			printf "gm <nomcompte> [Niveau_GM]\n";
+			printf "  Modifie le niveau de GM d'un compte.\n";
+			printf "  Valeur par défaut: 0 (suppression du niveau de GM).\n";
+			printf "  <exemple> gm nomtest 80\n";
+		} elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+			printf "id <nomcompte>\n";
+			printf "  Donne l'id d'un compte.\n";
+		} elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+			printf "info <idcompte>\n";
+			printf "  Affiche les informations sur un compte.\n";
+		} elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
+			printf "kami <message>\n";
+			printf "  Envoi un message général sur tous les serveurs de map (en jaune).\n";
+		} elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
+			printf "kamib <message>\n";
+			printf "  Envoi un message général sur tous les serveurs de map (en bleu).\n";
+		} elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+			printf("language <langue>\n");
+			printf("  Change la langue d'affichage.\n");
+			printf("  Langues possibles: 'Français' ou 'English'.\n");
+		} elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+			printf "list/ls [Premier_id [Dernier_id]]\n";
+			printf "  Affiche une liste de comptes.\n";
+			printf "  'Premier_id', 'Dernier_id': indique les identifiants de départ et de fin.\n";
+			printf "  La recherche par nom n'est pas possible avec cette commande.\n";
+			printf "  <example> list 10 9999999\n";
+		} elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
+			printf "listBan/lsBan [Premier_id [Dernier_id]]\n";
+			printf "  Comme list/ls, mais seulement pour les comptes GM avec un statut ou bannis.\n";
+		} elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
+			printf "listGM/lsGM [Premier_id [Dernier_id]]\n";
+			printf "  Comme list/ls, mais seulement pour les comptes GM.\n";
+		} elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
+			printf "listOK/lsOK [Premier_id [Dernier_id]]\n";
+			printf "  Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n";
+		} elsif ("memo" =~ /^\Q$command/) {
+			printf "memo <nomcompte> <memo>\n";
+			printf "  Modifie le mémo d'un compte.\n";
+			printf "  'memo': Il peut avoir jusqu'à 253 caractères (avec des espaces ou non).\n";
+		} elsif ("name" =~ /^\Q$command/) {
+			printf "name <idcompte>\n";
+			printf "  Donne le nom d'un compte.\n";
+		} elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
+			printf "passwd <nomcompte> <nouveaumotdepasse>\n";
+			printf "  Change le mot de passe d'un compte.\n";
+			printf "  Lorsque nouveaumotdepasse est omis,\n";
+			printf "  la saisie se fait sans que la frappe ne se voit.\n";
+		} elsif ("reloadgm" =~ /^\Q$command/) {
+			printf "reloadGM\n";
+			printf "  Reload GM configuration file\n";
+		} elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+			printf "search <expression>\n";
+			printf "  Cherche des comptes.\n";
+			printf "  Affiche les comptes dont les noms correspondent.\n";
+			printf "search -r/-e/--expr/--regex <expression>\n";
+			printf "  Cherche des comptes par expression regulière.\n";
+			printf "  Affiche les comptes dont les noms correspondent.\n";
+		} elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+			printf "sex <nomcompte> <sexe>\n";
+			printf "  Modifie le sexe d'un compte.\n";
+			printf "  <exemple> sex testname Male\n";
+		} elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
+			printf "state <nomcompte> <nouveaustatut> <message_erreur_7>\n";
+			printf "  Change le statut d'un compte.\n";
+			printf "  'nouveaustatut': Le statut est le même que celui du packet 0x006a + 1.\n";
+			printf "               les possibilités sont:\n";
+			printf "               0 = Compte ok\n";
+			printf "               1 = Unregistered ID\n";
+			printf "               2 = Incorrect Password\n";
+			printf "               3 = This ID is expired\n";
+			printf "               4 = Rejected from Server\n";
+			printf "               5 = You have been blocked by the GM Team\n";
+			printf "               6 = Your Game's EXE file is not the latest version\n";
+			printf "               7 = You are Prohibited to log in until...\n";
+			printf "               8 = Server is jammed due to over populated\n";
+			printf "               9 = No MSG\n";
+			printf "               100 = This ID has been totally erased\n";
+			printf "               all other values are 'No MSG', then use state 9 please.\n";
+			printf "  'message_erreur_7': message du code erreur 6 =\n";
+			printf "                      = Your are Prohibited to log in until... (packet 0x006a)\n";
+		} elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+			printf "timeadd <nomcompte> <modificateur>\n";
+			printf "  Ajoute/soustrait du temps à la limite de validité d'un compte.\n";
+			printf "  Le modificateur est composé comme suit:\n";
+			printf "    Valeur modificatrice (-1, 1, +1, etc...)\n";
+			printf "    Elément modifié:\n";
+			printf "      a ou y: année\n";
+			printf "      m:      mois\n";
+			printf "      j ou d: jour\n";
+			printf "      h:      heure\n";
+			printf "      mn:     minute\n";
+			printf "      s:      seconde\n";
+			printf "  <exemple> timeadd testname +1m-2mn1s-6a\n";
+			printf "            Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n";
+			printf "            et 6 ans dans le même temps.\n";
+			printf "NOTE: Vous ne pouvez pas modifier une limite de validité illimitée. Si vous\n";
+			printf "      désirez le faire, c'est que vous voulez probablement créer un limite de\n";
+			printf "      validité limitée. Donc, en premier, fixé une limite de valitidé.\n";
+		} elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+			printf "timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n";
+			printf "  Change la limite de validité d'un compte.\n";
+			printf "  Heure par défaut: 23:59:59\n";
+			printf "timeset <nomcompte> 0\n";
+			printf "  Donne une limite de validité illimitée (0 = illimitée).\n";
+		} elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
+			printf "unban/unbanish <nom compte>\n";
+			printf "  Ote le banissement d'un compte.\n";
+			printf "  La commande est l'équivalent de banset <nom_compte> 0.\n";
+		} elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
+			printf "unblock <nom compte>\n";
+			printf "  Place le status d'un compte à 0 (Compte ok).\n";
+			printf "  La commande est l'équivalent de state <nom_compte> 0.\n";
+		} elsif ("version" =~ /^\Q$command/) {
+			printf "version\n";
+			printf "  Affiche la version du login-serveur.\n";
+		} elsif ("who" =~ /^\Q$command/) {
+			printf "who <nomcompte>\n";
+			printf "  Affiche les informations sur un compte.\n";
+		} elsif ("quit" =~ /^\Q$command/ ||
+		         (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
+			printf "quit/end/exit\n";
+			printf "  Fin du programme d'administration.\n";
+		} else {
+			if ($receivedcommand ne "") {
+				printf "Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", $receivedcommand;
+			}
+			print << "ENDOFAIDE";
+ aide/help/?                             -- Affiche cet aide
+ aide/help/? [commande]                  -- Affiche l'aide de la commande
+ add <nomcompte> <sexe> <motdepasse>     -- Crée un compte (sans email)
+ ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>-- Change la date finale de banismnt
+ banadd/ba <nomcompte> <modificateur>    -- Ajout/soustrait du temps à la
+   exemple: ba moncompte +1m-2mn1s-2y       date finale de banissement
+ banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt
+ banset/bs <nomcompte> 0                 -- Dé-banis un compte.
+ block <nom compte>  -- Mets le status d'un compte à 5 (blocked by the GM Team)
+ check <nomcompte> <motdepasse>          -- Vérifie un mot de passe d'un compte
+ create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)
+ del <nomcompte>                         -- Supprime un compte
+ email <nomcompte> <email>               -- Modifie l'e-mail d'un compte
+ getcount                                -- Donne le nb de joueurs en ligne
+ gm <nomcompte> [Niveau_GM]              -- Modifie le niveau de GM d'un compte
+ id <nomcompte>                          -- Donne l'id d'un compte
+ info <idcompte>                         -- Affiche les infos sur un compte
+ kami <message>                          -- Envoi un message général (en jaune)
+ kamib <message>                         -- Envoi un message général (en bleu)
+ language <langue>                       -- Change la langue d'affichage.
+ list/ls [Premier_id [Dernier_id] ]      -- Affiche une liste de comptes
+ listBan/lsBan [Premier_id [Dernier_id] ]-- Affiche une liste de comptes
+                                            avec un statut ou bannis
+ listGM/lsGM [Premier_id [Dernier_id] ]  -- Affiche une liste de comptes GM
+ listOK/lsOK [Premier_id [Dernier_id] ]  -- Affiche une liste de comptes
+                                            sans status et non bannis
+ memo <nomcompte> <memo>                 -- Modifie le memo d'un compte
+ name <idcompte>                         -- Donne le nom d'un compte
+ passwd <nomcompte> <nouveaumotdepasse>  -- Change le mot de passe d'un compte
+ quit/end/exit                           -- Fin du programme d'administation
+ reloadGM                              -- Recharger le fichier de config des GM
+ search <expression>                     -- Cherche des comptes
+ search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX
+ sex <nomcompte> <sexe>                  -- Modifie le sexe d'un compte
+ state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte
+ timeadd/ta <nomcompte> <modificateur>   -- Ajout/soustrait du temps à la
+   exemple: ta moncompte +1m-2mn1s-2y       limite de validité
+ timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité
+ timeset/ts <nomcompte> 0                -- limite de validité = illimitée
+ unban/unbanish <nom compte>             -- Ote le banissement d'un compte
+ unblock <nom compte>            -- Mets le status d'un compte à 0 (Compte ok)
+ version                                 -- Donne la version du login-serveur
+ who <nomcompte>                         -- Affiche les infos sur un compte
+ENDOFAIDE
+			printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
+		}
+	} else {
+		if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+			printf "aide/help/?\n";
+			printf "  Display the description of the commands\n";
+			printf "aide/help/? [command]\n";
+			printf "  Display the description of the specified command\n";
+		} elsif ("help" =~ /^\Q$command/) {
+			printf "aide/help/?\n";
+			printf "  Display the description of the commands\n";
+			printf "aide/help/? [command]\n";
+			printf "  Display the description of the specified command\n";
+		} elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+			printf "add <account_name> <sex> <password>\n";
+			printf "  Create an account with the default email (a\@a.com).\n";
+			printf "  Concerning the sex, only the first letter is used (F or M).\n";
+			printf "  The e-mail is set to a\@a.com (default e-mail). It's like to have no e-mail.\n";
+			printf "  When the password is omitted,\n";
+			printf "  the input is done without displaying of the pressed keys.\n";
+			printf "  <example> add testname Male testpass\n";
+		} elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
+			printf "ban/banish yyyy/mm/dd hh:mm:ss <account_name>\n";
+			printf "  Changes the final date of a banishment of an account.\n";
+			printf "  The difference with banset is the position of the account name.\n";
+		} elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+			printf "banadd <account_name> <modifier>\n";
+			printf "  Adds or substracts time from the final date of a banishment of an account.\n";
+			printf "  Modifier is done as follows:\n";
+			printf "    Adjustment value (-1, 1, +1, etc...)\n";
+			printf "    Modified element:\n";
+			printf "      a or y: year\n";
+			printf "      m:  month\n";
+			printf "      j or d: day\n";
+			printf "      h:  hour\n";
+			printf "      mn: minute\n";
+			printf "      s:  second\n";
+			printf "  <example> banadd testname +1m-2mn1s-6y\n";
+			printf "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
+			printf "            and 6 years at the same time.\n";
+			printf "NOTE: If you modify the final date of a non-banished account,\n";
+			printf "      you fix the final date to (actual time +- adjustments)\n";
+		} elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+			printf "banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
+			printf "  Changes the final date of a banishment of an account.\n";
+			printf "  Default time: 23:59:59\n";
+			printf "banset <account_name> 0\n";
+			printf "  Set a non-banished account (0 = unbanished).\n";
+		} elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
+			printf "block <account name>\n";
+			printf "  Set state 5 (You have been blocked by the GM Team) to an account.\n";
+			printf "  Same command of state <account_name> 5.\n";
+		} elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+			printf "check <account_name> <password>\n";
+			printf "  Check the validity of a password for an account.\n";
+			printf "  NOTE: Server will never sends back a password.\n";
+			printf "        It's the only method you have to know if a password is correct.\n";
+			printf "        The other method is to have a ('physical') access to the accounts file.\n";
+		} elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+			printf "create <account_name> <sex> <email> <password>\n";
+			printf "  Like the 'add' command, but with e-mail moreover.\n";
+			printf "  <example> create testname Male my\@mail.com testpass\n";
+		} elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
+			printf "del <account_name>\n";
+			printf "  Remove an account.\n";
+			printf "  This order requires confirmation. After confirmation, the account is deleted.\n";
+		} elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
+			printf "email <account_name> <email>\n";
+			printf "  Modify the e-mail of an account.\n";
+		} elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+			printf "getcount\n";
+			printf "  Give the number of players online on all char-servers.\n";
+		} elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+			printf "gm <account_name> [GM_level]\n";
+			printf "  Modify the GM level of an account.\n";
+			printf "  Default value remove GM level (GM level = 0).\n";
+			printf "  <example> gm testname 80\n";
+		} elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+			printf "id <account_name>\n";
+			printf "  Give the id of an account.\n";
+		} elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+			printf "info <account_id>\n";
+			printf "  Display complete information of an account.\n";
+		} elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
+			printf "kami <message>\n";
+			printf "  Sends a broadcast message on all map-server (in yellow).\n";
+		} elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
+			printf "kamib <message>\n";
+			printf "  Sends a broadcast message on all map-server (in blue).\n";
+		} elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+			printf("language <language>\n");
+			printf("  Change the language of displaying.\n");
+			printf("  Possible languages: Français or English.\n");
+		} elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+			printf "list/ls [start_id [end_id]]\n";
+			printf "  Display a list of accounts.\n";
+			printf "  'start_id', 'end_id': indicate end and start identifiers.\n";
+			printf "  Research by name is not possible with this command.\n";
+			printf "  <example> list 10 9999999\n";
+		} elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
+			printf "listBan/lsBan [start_id [end_id]]\n";
+			printf "  Like list/ls, but only for accounts with state or banished.\n";
+		} elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
+			printf "listGM/lsGM [start_id [end_id]]\n";
+			printf "  Like list/ls, but only for GM accounts.\n";
+		} elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
+			printf "listOK/lsOK [start_id [end_id]]\n";
+			printf "  Like list/ls, but only for accounts without state and not banished.\n";
+		} elsif ("memo" =~ /^\Q$command/) {
+			printf "memo <account_name> <memo>\n";
+			printf "  Modify the memo of an account.\n";
+			printf "  'memo': it can have until 253 characters (with spaces or not).\n";
+		} elsif ("name" =~ /^\Q$command/) {
+			printf "name <account_id>\n";
+			printf "  Give the name of an account.\n";
+		} elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
+			printf "passwd <account_name> <new_password>\n";
+			printf "  Change the password of an account.\n";
+			printf "  When new password is omitted,\n";
+			printf "  the input is done without displaying of the pressed keys.\n";
+		} elsif ("reloadgm" =~ /^\Q$command/) {
+			printf "reloadGM\n";
+			printf "  Reload GM configuration file\n";
+		} elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+			printf "search <expression>\n";
+			printf "  Seek accounts.\n";
+			printf "  Displays the accounts whose names correspond.\n";
+			printf "search -r/-e/--expr/--regex <expression>\n";
+			printf "  Seek accounts by regular expression.\n";
+			printf "  Displays the accounts whose names correspond.\n";
+		} elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+		          $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+			printf "sex <account_name> <sex>\n";
+			printf "  Modify the sex of an account.\n";
+			printf "  <example> sex testname Male\n";
+		} elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
+			printf "state <account_name> <new_state> <error_message_#7>\n";
+			printf "  Change the state of an account.\n";
+			printf "  'new_state': state is the state of the packet 0x006a + 1.\n";
+			printf "               The possibilities are:\n";
+			printf "               0 = Account ok\n";
+			printf "               1 = Unregistered ID\n";
+			printf "               2 = Incorrect Password\n";
+			printf "               3 = This ID is expired\n";
+			printf "               4 = Rejected from Server\n";
+			printf "               5 = You have been blocked by the GM Team\n";
+			printf "               6 = Your Game's EXE file is not the latest version\n";
+			printf "               7 = You are Prohibited to log in until...\n";
+			printf "               8 = Server is jammed due to over populated\n";
+			printf "               9 = No MSG\n";
+			printf "               100 = This ID has been totally erased\n";
+			printf "               all other values are 'No MSG', then use state 9 please.\n";
+			printf "  'error_message_#7': message of the code error 6\n";
+			printf "                      = Your are Prohibited to log in until... (packet 0x006a)\n";
+		} elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+			printf "timeadd <account_name> <modifier>\n";
+			printf "  Adds or substracts time from the validity limit of an account.\n";
+			printf "  Modifier is done as follows:\n";
+			printf "    Adjustment value (-1, 1, +1, etc...)\n";
+			printf "    Modified element:\n";
+			printf "      a or y: year\n";
+			printf "      m:  month\n";
+			printf "      j or d: day\n";
+			printf "      h:  hour\n";
+			printf "      mn: minute\n";
+			printf "      s:  second\n";
+			printf "  <example> timeadd testname +1m-2mn1s-6y\n";
+			printf "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
+			printf "            and 6 years at the same time.\n";
+			printf "NOTE: You can not modify a unlimited validity limit.\n";
+			printf "      If you want modify it, you want probably create a limited validity limit.\n";
+			printf "      So, at first, you must set the validity limit to a date/time.\n";
+		} elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+			printf "timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
+			printf "  Changes the validity limit of an account.\n";
+			printf "  Default time: 23:59:59\n";
+			printf "timeset <account_name> 0\n";
+			printf "  Gives an unlimited validity limit (0 = unlimited).\n";
+		} elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
+			printf "unban/unbanish <account name>\n";
+			printf "  Remove the banishment of an account.\n";
+			printf "  This command works like banset <account_name> 0.\n";
+		} elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
+			printf "unblock <account name>\n";
+			printf "  Set state 0 (Account ok) to an account.\n";
+			printf "  This command works like state <account_name> 0.\n";
+		} elsif ("version" =~ /^\Q$command/) {
+			printf "version\n";
+			printf "  Display the version of the login-server.\n";
+		} elsif ("who" =~ /^\Q$command/) {
+			printf "who <account_name>\n";
+			printf "  Displays complete information of an account.\n";
+		} elsif ("quit" =~ /^\Q$command/ ||
+		         (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
+			printf "quit/end/exit\n";
+			printf "  End of the program of administration.\n";
+		} else {
+			if ($receivedcommand ne "") {
+				printf "Unknown command [%s] for help. Displaying of all commands.\n", $receivedcommand;
+			}
+			print << "ENDOFHELP";
+ aide/help/?                          -- Display this help
+ aide/help/? [command]                -- Display the help of the command
+ add <account_name> <sex> <password>  -- Create an account with default email
+ ban/banish yyyy/mm/dd hh:mm:ss <account_name> -- Change final date of a ban
+ banadd/ba <account_name> <modifier>  -- Add or substract time from the final
+   example: ba apple +1m-2mn1s-2y        date of a banishment of an account
+ banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban
+ banset/bs <account_name> 0           -- Un-banish an account
+ block <account name>    -- Set state 5 (blocked by the GM Team) to an account
+ check <account_name> <password>      -- Check the validity of a password
+ create <account_name> <sex> <email> <passwrd> -- Create an account with email
+ del <account_name>                   -- Remove an account
+ email <account_name> <email>         -- Modify an email of an account
+ getcount                             -- Give the number of players online
+ gm <account_name> [GM_level]         -- Modify the GM level of an account
+ id <account_name>                    -- Give the id of an account
+ info <account_id>                    -- Display all information of an account
+ kami <message>                       -- Sends a broadcast message (in yellow)
+ kamib <message>                      -- Sends a broadcast message (in blue)
+ language <language>                  -- Change the language of displaying.
+ list/ls [First_id [Last_id]]         -- Display a list of accounts
+ listBan/lsBan [First_id [Last_id]]   -- Display a list of accounts
+                                         with state or banished
+ listGM/lsGM [First_id [Last_id]]     -- Display a list of GM accounts
+ listOK/lsOK [First_id [Last_id]]     -- Display a list of accounts
+                                         without state and not banished
+ memo <account_name> <memo>           -- Modify the memo of an account
+ name <account_id>                    -- Give the name of an account
+ passwd <account_name> <new_password> -- Change the password of an account
+ quit/end/exit                        -- End of the program of administation
+ reloadGM                             -- Reload GM configuration file
+ search <expression>                  -- Seek accounts
+ search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression
+ sex <nomcompte> <sexe>               -- Modify the sex of an account
+ state <account_name> <new_state> <error_message_#7> -- Change the state
+ timeadd/ta <account_name> <modifier> -- Add or substract time from the
+   example: ta apple +1m-2mn1s-2y        validity limit of an account
+ timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit
+ timeset/ts <account_name> 0         -- Give a unlimited validity limit
+ unban/unbanish <account name>       -- Remove the banishment of an account
+ unblock <account name>              -- Set state 0 (Account ok) to an account
+ version                             -- Gives the version of the login-server
+ who <account_name>                  -- Display all information of an account
+ENDOFHELP
+			printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
+		}
+	}
+
+	return 0;
+}
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the accounts list
+sub listaccount() {
+	my($st, $ed, $listflag) = @_;
+	my($i);
+	my($n) = (0);
+	#      0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
+	if ($defaultlanguage eq "F") {
+		print " id_compte GM nom_utilisateur         sexe   count statut\n";
+	} else {
+		print "account_id GM user_name               sex    count state\n";
+	}
+	print "-------------------------------------------------------------------------------\n";
+	while(1) {
+		print $so pack("vV2", 0x7920, $st, $ed);
+		$so->flush();
+		$buf = readso(4);
+		if (unpack("v", $buf) != 0x7921) {
+			if ($defaultlanguage eq "F") {
+				print "Problème de connexion au serveur (réponse incorrecte).\n";
+			} else {
+				print "Connection error to the server (incorrect answer).\n";
+			}
+			exit(10);
+		}
+		my($len) = unpack("x2v", $buf);
+		last if ($len <= 4);
+		for($i = 4; $i < $len; $i += 38) {
+			my(@dat) = unpack("VCa24cVV", readso(38));
+			$st = $dat[0] + 1;
+			if ($listflag == 0 ||
+			    ($listflag == 1 && $dat[1] > 0) || # check GM flag
+			    ($listflag == 3 && $dat[5] != 0) || # check with state or banished
+			    ($listflag == 4 && $dat[5] == 0)) { # check without state and not banished
+				printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
+				        ($dat[1] == 0 ? "  " : $dat[1]),
+				        $dat[2],
+				        ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
+				        $dat[4],
+				        (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+				         "Unregistered ID",
+				         "Incorrect Password",
+				         "This ID is expired",
+				         "Rejected from Server",
+				         "Blocked by the GM Team", # You have been blocked by the GM Team
+				         "Your EXE file is too old", # Your Game's EXE file is not the latest version
+				         "Banishement or\n                                                   Prohibited to login until %s", # You are Prohibited to log in until %s
+				         "Server is over populated", # Server is jammed due to over populated
+				         "No MSG",
+				         "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
+				$n++;
+			}
+		}
+	}
+	if ($defaultlanguage eq "F") {
+		if ($n == 0) {
+			print "Aucun compte trouvé.\n";
+		} elsif ($n == 1) {
+			print "1 compte trouvé.\n";
+		} else {
+			print "$n comptes trouvés.\n";
+		}
+	} else {
+		if ($n == 0) {
+			print "No account found.\n";
+		} elsif ($n == 1) {
+			print "1 account found.\n";
+		} else {
+			print "$n accounts found.\n";
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: add an account with the default e-mail
+sub addaccount() {
+	my($userid, $sex, $passwd) = @_;
+	if ($userid eq "" || !defined($userid)) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> add nomtest Male motdepassetest\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> add testname Male testpass\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+#		if ($defaultlanguage eq "F") {
+#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+#		} else {
+#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+#		}
+#		return 101;
+#	}
+	$sex = uc(substr($sex, 0, 1));
+	if ($sex !~ /^[MF]$/) {
+		if ($defaultlanguage eq "F") {
+			print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
+		} else {
+			print "Illegal gender [$sex]. Please input M or F.\n";
+		}
+		return 103;
+	}
+	if ($passwd eq "") {
+		return 108 if (($passwd = typepasswd()) eq "");
+	}
+	if (verify_password($passwd) == 0) {
+		return 104;
+	}
+	print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, "");
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7931) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 106;
+	}
+	$buf = readso(28);
+	if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
+		} else {
+			print "Account [$userid] creation failed. Same account already exists.\n";
+		}
+		return 107;
+	} else {
+		if ($defaultlanguage eq "F") {
+			printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
+		} else {
+			printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: add an account with an e-mail
+sub createaccount() {
+	my($userid, $sex, $email, $passwd) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> create nomtest Male mon\@email.com motdepassetest\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> create testname Male my\@mail.com testpass\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+#		if ($defaultlanguage eq "F") {
+#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+#		} else {
+#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+#		}
+#		return 101;
+#	}
+	$sex = uc(substr($sex, 0, 1));
+	if ($sex !~ /^[MF]$/) {
+		if ($defaultlanguage eq "F") {
+			print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
+		} else {
+			print "Illegal gender [$sex]. Please input M or F.\n";
+		}
+		return 103;
+	}
+	if (length($email) < 3) {
+		if ($defaultlanguage eq "F") {
+			print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
+		} else {
+			print "Email is too short [$email]. Please input a valid e-mail.\n";
+		}
+		return 109;
+	}
+	if (length($email) > 39) {
+		if ($defaultlanguage eq "F") {
+			print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
+		} else {
+			print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
+		}
+		return 109;
+	}
+	if (verify_email($email) == 0) {
+		if ($defaultlanguage eq "F") {
+			print "Email incorrecte [$email]. Entrez une e-mail valide svp.\n";
+		} else {
+			print "Invalid email [$email]. Please input a valid e-mail.\n";
+		}
+		return 109;
+	}
+	if ($passwd eq "") {
+		return 108 if (($passwd = typepasswd()) eq "");
+	}
+	if (verify_password($passwd) == 0) {
+		return 104;
+	}
+	print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, $email);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7931) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 106;
+	}
+	$buf = readso(28);
+	if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
+		} else {
+			print "Account [$userid] creation failed. Same account already exists.\n";
+		}
+		return 107;
+	} else {
+		if ($defaultlanguage eq "F") {
+			printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
+		} else {
+			printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: deletion of an account
+sub delaccount() {
+	my($userid) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> del nomtestasupprimer\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> del testnametodelete\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	if ($defaultlanguage eq "F") {
+		print "** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) ";
+	} else {
+		print "** Are you really sure to DELETE account [$userid]? (y/n) ";
+	}
+	if (lc(substr(<STDIN>, 0, 1)) !~ /[oy]/) {
+		if ($defaultlanguage eq "F") {
+			print "Suppression annulée\n.";
+		} else {
+			print "Deletion canceled\n";
+		}
+		return 121;
+	}
+	print $so pack("va24", 0x7932, $userid);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7933) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 122;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec de la suppression du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Account [$userid] deletion failed. Account doesn't exist.\n";
+		}
+		return 123;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Compte [$name][id: $id2] SUPPRIME avec succès.\n";
+		} else {
+			print "Account [$name][id: $id2] is successfully DELETED.\n";
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modification of a password
+sub changepasswd() {
+	my($userid, $passwd) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> passwd nomtest nouveaumotdepasse\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> passwd testname newpassword\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	if ($passwd eq "") {
+		return 134 if (($passwd = typepasswd()) eq "");
+	}
+	if (verify_password($passwd) == 0) {
+		return 131;
+	}
+	print $so pack("va24a24", 0x7934, $userid,$passwd);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7935) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 132;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec de la modification du mot de passe du compte [$userid].\n";
+			print "Le compte [$userid] n'existe pas.\n";
+		} else {
+			print "Account [$userid] password changing failed.\n";
+			print "Account [$userid] doesn't exist.\n";
+		}
+		return 133;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Modification du mot de passe du compte [$name][id: $id2] réussie.\n";
+		} else {
+			print "Account [$name][id: $id2] password successfully changed.\n";
+		}
+	}
+	return 130;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modification of an account e-mail
+sub changeemail() {
+	my($userid, $email) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> email testname nouveauemail\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> email testname newemail\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	if (length($email) < 3) {
+		if ($defaultlanguage eq "F") {
+			print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
+		} else {
+			print "Email is too short [$email]. Please input a valid e-mail.\n";
+		}
+		return 109;
+	}
+	if (length($email) > 39) {
+		if ($defaultlanguage eq "F") {
+			print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
+		} else {
+			print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
+		}
+		return 109;
+	}
+	if (verify_email($email) == 0) {
+		if ($defaultlanguage eq "F") {
+			print "Email incorrect [$email]. Entrez une e-mail valide svp.\n";
+		} else {
+			print "Invalid email [$email]. Please input a valid e-mail.\n";
+		}
+		return 109;
+	}
+	print $so pack("va24a40", 0x7940, $userid, $email);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7941) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 162;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec de la modification de l'e-mail du compte [$userid].\n";
+			print "Le compte [$userid] n'existe pas.\n";
+		} else {
+			print "Account [$userid] e-mail changing failed.\n";
+			print "Account [$userid] doesn't exist.\n";
+		}
+		return 133;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Modification de l'e-mail du compte [$name][id: $id2] réussie.\n";
+		} else {
+			print "Account [$name][id: $id2] e-mail successfully changed.\n";
+		}
+	}
+	return 160;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: search of accounts
+sub searchaccount() {
+	my($p1, $p2) = @_;
+	my($exp) = ("");
+	if ($p1 eq "-e" || $p1 eq "-r" || $p1 eq "--regex" || $p1 eq "--expr") {
+		if ($p2 eq "") {
+			if ($defaultlanguage eq "F") {
+				print "Entrez une expression régulière ou utilisez 'ls' pour avoir tous les comptes.\n";
+			} else {
+				print "Input a regular expression or use 'ls' to obtain all accounts.\n";
+			}
+			return 141;
+		}
+		$exp = $p2;
+	} else {
+		if ($p1 eq "") {
+			if ($defaultlanguage eq "F") {
+				print "Entrez une chaîne ou utilisez 'ls' pour avoir tous les comptes.\n";
+			} else {
+				print "Input a string or use 'ls' to obtain all accounts.\n";
+			}
+			return 141;
+		}
+		my($c) = 0;
+		$exp = lc($p1);
+		$exp =~ s/([\@])/\\$1/g;
+		$c += $exp =~ s/([\-\[\]])/\\$1/g;
+		$c += $exp =~ s/([\*\?])/.$1/g;
+		$c += $exp =~ s/\\\[(.)\\\-(.)\\\]/[$1-$2]/g;
+		$exp = "^$exp\$" if $c;
+	}
+	if (eval{ "" =~ /$exp/; }, $@) {
+		if ($defaultlanguage eq "F") {
+			print "Expression régulière non reconnue.\n";
+		} else {
+			print "Regular-Expression compiling failed.\n";
+		}
+		return 141;
+	}
+	my($i);
+	my($n, $st) = (0, 0);
+	#      0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
+	if ($defaultlanguage eq "F") {
+		print " id_compte GM nom_utilisateur         sexe   count statut\n";
+	} else {
+		print "account_id GM user_name               sex    count state\n";
+	}
+	print "-------------------------------------------------------------------------------\n";
+	while(1) {
+		print $so pack("vV2", 0x7920, $st, 0);
+		$so->flush();
+		$buf = readso(4);
+		if (unpack("v", $buf) != 0x7921) {
+			if ($defaultlanguage eq "F") {
+				print "Problème de connexion au serveur (réponse incorrecte).\n";
+			} else {
+				print "Connection error to the server (incorrect answer).\n";
+			}
+			exit(10);
+		}
+		my($len) = unpack("x2v", $buf);
+		last if ($len <= 4);
+		for($i = 4; $i < $len; $i += 38) {
+			my(@dat) = unpack("VCa24cVV", readso(38));
+			$st = $dat[0] + 1;
+			next if (lc($dat[2]) !~ /$exp/);
+			printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
+			        ($dat[1] == 0 ? "  " : $dat[1]),
+			        $dat[2],
+			        ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
+			        $dat[4],
+			        (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+			         "Unregistered ID",
+			         "Incorrect Password",
+			         "This ID is expired",
+			         "Rejected from Server",
+			         "Blocked by the GM Team", # You have been blocked by the GM Team
+			         "Your EXE file is too old", # Your Game's EXE file is not the latest version
+			         "Banishement or\n                                                   Prohibited to login until %s", # You are Prohibited to log in until %s
+			         "Server is over populated", # Server is jammed due to over populated
+			         "No MSG",
+			         "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
+			$n++;
+		}
+	}
+	if ($defaultlanguage eq "F") {
+		if ($n == 0) {
+			print "Aucun compte trouvé.\n";
+		} elsif ($n == 1) {
+			print "1 compte trouvé.\n";
+		} else {
+			print "$n comptes trouvés.\n";
+		}
+	} else {
+		if ($n == 0) {
+			print "No account found.\n";
+		} elsif ($n == 1) {
+			print "1 account found.\n";
+		} else {
+			print "$n accounts found.\n";
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modify the sex of an account
+sub changesex() {
+	my($userid, $sex) = @_;
+	if ($userid eq "" || !defined($userid)) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> sex nomtest Male\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> sex testname Male\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+#		if ($defaultlanguage eq "F") {
+#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+#		} else {
+#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+#		}
+#		return 101;
+#	}
+	$sex = uc(substr($sex, 0, 1));
+	if ($sex !~ /^[MF]$/) {
+		if ($defaultlanguage eq "F") {
+			print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
+		} else {
+			print "Illegal gender [$sex]. Please input M or F.\n";
+		}
+		return 103;
+	}
+	print $so pack("va24a1", 0x793c, $userid, $sex);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x793d) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement du sexe du compte [$userid].\n";
+			print "Le compte n'existe pas ou le sexe est déjà celui demandé.\n";
+		} else {
+			print "Account [$userid] sex changing failed.\n";
+			print "Account doesn't exist or the sex is already the good sex.\n";
+		}
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Sexe du compte [$name][id: $id2] changé avec succès.\n";
+		} else {
+			print "Account [$name][id: $id2] sex successfully changed.\n";
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modify the GM level of an account
+sub changegmlevel() {
+	my($userid, $gm_level) = @_;
+	if ($userid eq "" || !defined($userid)) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> gm nomtest 80\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> gm testname 80\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+#	if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+#		if ($defaultlanguage eq "F") {
+#			print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+#		} else {
+#			print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+#		}
+#		return 101;
+#	}
+	$gm_level = int($gm_level);
+	if ($gm_level < 0 || $gm_level > 99) {
+		if ($defaultlanguage eq "F") {
+			print "Niveau de GM incorrect [$gm_level]. Entrez une valeur de 0 à 99 svp.\n";
+		} else {
+			print "Illegal GM level [$gm_level]. Please input a value from 0 to 99.\n";
+		}
+		return 103;
+	}
+	print $so pack("va24C", 0x793e, $userid, $gm_level);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x793f) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement du niveau de GM du compte [$userid].\n";
+			print "Le compte n'existe pas, le niveau de GM est déjà celui demandé,\n";
+			print "ou il est impossible de modifier le fichier des comptes GM.\n";
+		} else {
+			print "Account [$userid] GM level changing failed.\n";
+			print "Account doesn't exist, the GM level is already the good GM level,\n";
+			print "or it's impossible to modify the GM accounts file.\n";
+		}
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Niveau de GM du compte [$name][id: $id2] changé avec succès.\n";
+		} else {
+			print "Account [$name][id: $id2] GM level successfully changed.\n";
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Modification of a state
+sub changestate {
+	my($userid, $s, $error_message) = @_;
+	# Valid values: 0: ok, or value of the 0x006a packet + 1
+	if ($s eq "" || (($s < 0 || $s > 9) && $s != 100)) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez une des valeurs suivantes svp:\n";
+			print "  0 = Compte ok             6 = Your Game's EXE file is not the latest version\n";
+		} else {
+			print "Please input one of these values:\n";
+			print "  0 = Account ok            6 = Your Game's EXE file is not the latest version\n";
+		}
+		print "  1 = Unregistered ID       7 = You are Prohibited to log in until %s\n";
+		print "  2 = Incorrect Password    8 = Server is jammed due to over populated\n";
+		print "  3 = This ID is expired    9 = No MSG\n";
+		print "  4 = Rejected from Server  100 = This ID has been totally erased\n";
+		print "  5 = You have been blocked by the GM Team\n";
+		if ($defaultlanguage eq "F") {
+			print "<exemples> state nomtest 5\n";
+			print "           state nomtest 7 fin de votre ban\n";
+			print "           block <nom du compte>\n";
+			print "           unblock <nom du compte>\n";
+		} else {
+			print "<examples> state testname 5\n";
+			print "           state testname 7 end of your ban\n";
+			print "           block <account name>\n";
+			print "           unblock <account name>\n";
+		}
+		return 151;
+	}
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemples> state nomtest 5\n";
+			print "           state nomtest 7 fin de votre ban\n";
+			print "           block <nom du compte>\n";
+			print "           unblock <nom du compte>\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<examples> state testname 5\n";
+			print "           state testname 7 end of your ban\n";
+			print "           block <account name>\n";
+			print "           unblock <account name>\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	if ($s != 7) {
+		$error_message = "-";
+	} else {
+		if (length($error_message) < 1) {
+			if ($defaultlanguage eq "F") {
+				print "Message d'erreur trop court. Entrez un message de 1-19 caractères.\n";
+			} else {
+				print "Error message is too short. Please input a message of 1-19 bytes.\n";
+			}
+			return 102;
+		}
+		if (length($error_message) > 19) {
+			if ($defaultlanguage eq "F") {
+				print "Message d'erreur trop long. Entrez un message de 1-19 caractères.\n";
+			} else {
+				print "Error message is too long. Please input a message of 1-19 bytes.\n";
+			}
+			return 102;
+		}
+	}
+	print $so pack("va24Va20", 0x7936, $userid, $s, $error_message);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7937) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(32);
+	my(@dat) = unpack("Va24V", $buf);
+	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+		chop($dat[1]);
+	};
+	if ($dat[0] != -1 && $dat[0] != 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Statut du compte [$dat[1]][id: $dat[0]] changé avec succès en [";
+		} else {
+			print "Account [$dat[1]][id: $dat[0]] state successfully changed in [";
+		}
+		print ((($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+		  "Unregistered ID",
+		  "Incorrect Password",
+		  "This ID is expired",
+		  "Rejected from Server",
+		  "You have been blocked by the GM Team",
+		  "Your Game's EXE file is not the latest version",
+		  "You are Prohibited to log in until %s",
+		  "Server is jammed due to over populated",
+		  "No MSG",
+		  "This ID has been totally erased")[$dat[2] == 100 ? 10 : $dat[2]]);
+		print "].\n";
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement du statut du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Account [$userid] state changing failed. Account doesn't exist.\n";
+		}
+	}
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the number of online players
+sub getlogincount {
+	# Request to the login-server
+	print $so pack("v", 0x7938);
+	$so->flush();
+
+	$buf = readso(4);
+	# Connection failed
+	if (unpack("v", $buf) != 0x7939) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		exit(3);
+	}
+
+	# Get length of the received packet
+	my($len) = unpack("x2v", $buf) - 4;
+
+	# Read information of the servers
+	if ($len < 1) {
+		if ($defaultlanguage eq "F") {
+			printf "  Aucun serveur n'est connecté au login serveur.\n";
+		} else {
+			printf "  No server is connected to the login-server.\n";
+		}
+	} else {
+		my(@slist) = ();
+		for(; $len > 0; $len -= 32) {
+			my($name, $count) = unpack("x6 a20 V", readso(32));
+			$name = substr($name, 0, index($name, "\0"));
+			push @slist, [ $name, $count ];
+		}
+		# Displaying of result
+		my($i);
+		if ($defaultlanguage eq "F") {
+			printf "  Nombre de joueurs en ligne (serveur: nb):\n";
+		} else {
+			printf "  Number of online players (server: number).\n";
+		}
+		foreach $i(@slist) {
+			printf "    %-20s : %5d\n", $i->[0], $i->[1];
+		}
+	}
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Modification of a memo field
+sub changememo {
+	my($userid, $memo) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> memo nomtest nouveau memo\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> memo testname new memo\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	if (length($memo) > 254) {
+		if ($defaultlanguage eq "F") {
+			print "Mémo trop long (".length($memo)." caractères).\n";
+			print "Entrez un mémo de 254 caractères maximum svp.\n";
+		} else {
+			print "Memo is too long (".length($memo)." characters).\n";
+			print "Please input a memo of 254 bytes at the maximum.\n";
+		}
+		return 102;
+	}
+	if (length($memo) == 0) {
+		print $so pack("va24v", 0x7942, $userid, 0);
+	} else {
+		print $so pack("va24va".length($memo), 0x7942, $userid, length($memo), $memo);
+	}
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7943) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement du mémo du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Account [$userid] memo changing failed. Account doesn't exist.\n";
+		}
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Mémo du compte [$name][id: $id2] changé avec succès.\n";
+		} else {
+			print "Account [$name][id: $id2] memo successfully changed.\n";
+		}
+	}
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to obtain an account id
+sub idaccount() {
+	my($userid) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> id nomtest\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> id testname\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	print $so pack("va24", 0x7944, $userid);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7945) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 122;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Impossible de trouver l'id du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Unabled to find the account [$userid] id. Account doesn't exist.\n";
+		}
+		return 123;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Le compte [$name] a pour id: $id2.\n";
+		} else {
+			print "The account [$name] have the id: $id2.\n";
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to obtain an account name
+sub nameaccount() {
+	my($id) = @_;
+	if ($id < 0) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un id ayant une valeur positive svp.\n";
+		} else {
+			print "Please input a positive value for the id.\n";
+		}
+		return 136;
+	}
+	print $so pack("vV", 0x7946, $id);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7947) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 122;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if (length($name) == 0 || $name eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
+		} else {
+			print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
+		}
+		return 123;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Le compte [id: $id2] a pour nom: $name.\n";
+		} else {
+			print "The account [id: $id2] have the name: $name.\n";
+		}
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Set a validity limit of an account
+sub timesetaccount() {
+	my($userid, $date, $time) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
+			print "           timeset <nom_du_compte> 0    (0 = illimité)\n";
+			printf "          Heure par défaut [hh:mm:ss]: 23:59:59\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
+			print "           timeset <account_name> 0   (0 = unlimited)\n";
+			printf "          Default time [hh:mm:ss]: 23:59:59\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	my($year, $month, $day) = split(/[.\-\/]/, $date);
+	my($hour, $minute, $second) = split(/:/, $time);
+	if ($time eq "") {
+		$hour = 23;
+		$minute = 59;
+		$second = 59;
+	}
+	my($timestamp);
+	if ($year eq "" ||
+	    ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+		} else {
+			print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+		}
+		return 102;
+	}
+	if ($year == 0) {
+		$timestamp = 0;
+	} else {
+		if ($year < 70) {
+			$year = $year + 100;
+		}
+		if ($year >= 1900) {
+			$year = $year - 1900;
+		}
+		if ($month < 1 || $month > 12) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez un mois correct svp (entre 1 et 12).\n";
+			} else {
+				print "Please give a correct value for the month (from 1 to 12).\n";
+			}
+			return 102;
+		}
+		$month = $month - 1;
+		if ($day < 1 || $day > 31) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez un jour correct svp (entre 1 et 31).\n";
+			} else {
+				print "Please give a correct value for the day (from 1 to 31).\n";
+			}
+			return 102;
+		}
+		if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
+		    ($month == 1 && $day > 29)) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez un jour correct en fonction du mois svp.\n";
+			} else {
+				print "Please give a correct value for a day of this month.\n";
+			}
+			return 102;
+		}
+		if ($hour < 0 || $hour > 23) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez une heure correcte svp (entre 0 et 23).\n";
+			} else {
+				print "Please give a correct value for the hour (from 0 to 23).\n";
+			}
+			return 102;
+		}
+		if ($minute < 0 || $minute > 59) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez des minutes correctes svp (entre 0 et 59).\n";
+			} else {
+				print "Please give a correct value for the minutes (from 0 to 59).\n";
+			}
+			return 102;
+		}
+		if ($second < 0 || $second > 59) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez des secondes correctes svp (entre 0 et 59).\n";
+			} else {
+				print "Please give a correct value for the seconds (from 0 to 59).\n";
+			}
+			return 102;
+		}
+		$timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
+		if ($timestamp == undef) {
+			if ($defaultlanguage eq "F") {
+				print "Date incorrecte.\n";
+				print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+			} else {
+				print "Invalid date.\n";
+				print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+			}
+			return 102;
+		}
+	}
+
+	print $so pack("va24V", 0x7948, $userid, $timestamp);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7949) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(32);
+	my(@dat) = unpack("Va24V", $buf);
+	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+		chop($dat[1]);
+	};
+	if ($dat[0] != -1 && $dat[0] != 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+			($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+		} else {
+			print "Validity Limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
+			($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
+		}
+		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
+		}
+	}
+
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Add/substract time to the validity limit of an account
+sub timeaddaccount() {
+	my($userid, $modif) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "  <exemple> timeadd nomtest +1m-2mn1s-6y\n";
+			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+			print "            et 6 ans dans le même temps.\n";
+		} else {
+			print "Please input an account name.\n";
+			print "  <example> timeadd testname +1m-2mn1s-6y\n";
+			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
+			print "            and 6 years at the same time.\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	my($year, $month, $day) = (0, 0 ,0);
+	my($hour, $minute, $second) = (0, 0 ,0);
+
+	$modif = lc($modif);
+	while (length($modif) > 0) {
+		my($value) = int($modif);
+		if ($value == 0) {
+			$modif = substr($modif, 1);
+		} else {
+			if (substr($modif, 0, 1) =~ /[\-\+]/) {
+				$modif = substr($modif, 1);
+			}
+			while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
+				$modif = substr($modif, 1);
+			}
+			if (index($modif, "s") == 0) {
+				$second = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "mn") == 0) {
+				$minute = $value;
+				$modif = substr($modif, 2);
+			} elsif (index($modif, "h") == 0) {
+				$hour = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
+				$day = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "m") == 0) {
+				$month = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
+				$year = $value;
+				$modif = substr($modif, 1);
+			} else {
+				$modif = substr($modif, 1);
+			}
+		}
+	}
+
+	if ($defaultlanguage eq "F") {
+		print " année:   $year\n";
+		print " mois:    $month\n";
+		print " jour:    $day\n";
+		print " heure:   $hour\n";
+		print " minute:  $minute\n";
+		print " seconde: $second\n";
+	} else {
+		print " year:   $year\n";
+		print " month:  $month\n";
+		print " day:    $day\n";
+		print " hour:   $hour\n";
+		print " minute: $minute\n";
+		print " second: $second\n";
+	}
+
+	if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
+		if ($defaultlanguage eq "F") {
+			print "Vous devez entrer un ajustement avec cette commande, svp:\n";
+			print "  Valeur d'ajustement (-1, 1, +1, etc...)\n";
+			print "  Element modifié:\n";
+			print "    a ou y: année\n";
+			print "    m:      mois\n";
+			print "    j ou d: jour\n";
+			print "    h:      heure\n";
+			print "    mn:     minute\n";
+			print "    s:      seconde\n";
+			print "  <exemple> timeadd nomtest +1m-2mn1s-6y\n";
+			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+			print "            et 6 ans dans le même temps.\n";
+		} else {
+			print "Please give an adjustment with this command:\n";
+			print "  Adjustment value (-1, 1, +1, etc...)\n";
+			print "  Modified element:\n";
+			print "    a or y: year\n";
+			print "    m:      month\n";
+			print "    j or d: day\n";
+			print "    h:       hour\n";
+			print "    mn:      minute\n";
+			print "    s:       second\n";
+			print "  <example> timeadd testname +1m-2mn1s-6y\n";
+			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
+			print "            and 6 years at the same time.\n";
+		}
+		return 137;
+	}
+	if ($year > 127 || $year < -127) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the years (from -127 to 127).\n";
+		}
+		return 137;
+	}
+	if ($month > 255 || $month < -255) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the months (from -255 to 255).\n";
+		}
+		return 137;
+	}
+	if ($day > 32767 || $day < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+	if ($hour > 32767 || $hour < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+	if ($minute > 32767 || $minute < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+	if ($second > 32767 || $second < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+
+	print $so pack("va24vvvvvv", 0x7950, $userid, $year, $month, $day, $hour, $minute, $second);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7951) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(32);
+	my(@dat) = unpack("Va24V", $buf);
+	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+		chop($dat[1]);
+	};
+	if ($dat[0] == -1 || $dat[0] == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
+		}
+	} elsif ($dat[2] == 0) {
+		if ($defaultlanguage eq "F") {
+			print "Limite de validité du compte [$dat[1]][id: $dat[0]] inchangée.\n";
+			print "Le compte a une validité illimitée ou\n";
+			print "la modification est impossible avec les ajustements demandés.\n";
+		} else {
+			print "Validity limit of the account [$dat[1]][id: $dat[0]] unchanged.\n";
+			print "The account have an unlimited validity limit or\n";
+			print "the changing is impossible with the proposed adjustments.\n";
+		}
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+			($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+		} else {
+			print "Validity limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
+			($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
+		}
+		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+	}
+
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Set the final date of a banishment of an account
+sub bansetaccount() {
+	my($userid, $date, $time) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
+			print "           banset <nom_du_compte> 0    (0 = dé-bani)\n";
+			print "           ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n";
+			print "           unban/unbanish <nom du compte>\n";
+			printf "          Heure par défaut [hh:mm:ss]: 23:59:59\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
+			print "           banset <account_name> 0   (0 = un-banished)\n";
+			print "           ban/banish yyyy/mm/dd hh:mm:ss <account name>\n";
+			print "           unban/unbanish <account name>\n";
+			printf "          Default time [hh:mm:ss]: 23:59:59\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	my($year, $month, $day) = split(/[.\-\/]/, $date);
+	my($hour, $minute, $second) = split(/:/, $time);
+	if ($time eq "") {
+		$hour = 23;
+		$minute = 59;
+		$second = 59;
+	}
+	my($timestamp);
+	if ($year eq "" ||
+	    ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+		} else {
+			print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+		}
+		return 102;
+	}
+	if ($year == 0) {
+		$timestamp = 0;
+	} else {
+		if ($year < 70) {
+			$year = $year + 100;
+		}
+		if ($year >= 1900) {
+			$year = $year - 1900;
+		}
+		if ($month < 1 || $month > 12) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez un mois correct svp (entre 1 et 12).\n";
+			} else {
+				print "Please give a correct value for the month (from 1 to 12).\n";
+			}
+			return 102;
+		}
+		$month = $month - 1;
+		if ($day < 1 || $day > 31) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez un jour correct svp (entre 1 et 31).\n";
+			} else {
+				print "Please give a correct value for the day (from 1 to 31).\n";
+			}
+			return 102;
+		}
+		if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
+		    ($month == 1 && $day > 29)) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez un jour correct en fonction du mois svp.\n";
+			} else {
+				print "Please give a correct value for a day of this month.\n";
+			}
+			return 102;
+		}
+		if ($hour < 0 || $hour > 23) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez une heure correcte svp (entre 0 et 23).\n";
+			} else {
+				print "Please give a correct value for the hour (from 0 to 23).\n";
+			}
+			return 102;
+		}
+		if ($minute < 0 || $minute > 59) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez des minutes correctes svp (entre 0 et 59).\n";
+			} else {
+				print "Please give a correct value for the minutes (from 0 to 59).\n";
+			}
+			return 102;
+		}
+		if ($second < 0 || $second > 59) {
+			if ($defaultlanguage eq "F") {
+				print "Entrez des secondes correctes svp (entre 0 et 59).\n";
+			} else {
+				print "Please give a correct value for the seconds (from 0 to 59).\n";
+			}
+			return 102;
+		}
+		$timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
+		if ($timestamp == undef) {
+			if ($defaultlanguage eq "F") {
+				print "Date incorrecte.\n";
+				print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+			} else {
+				print "Invalid date.\n";
+				print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+			}
+			return 102;
+		}
+	}
+
+	print $so pack("va24V", 0x794a, $userid, $timestamp);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x794b) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(32);
+	my(@dat) = unpack("Va24V", $buf);
+	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+		chop($dat[1]);
+	};
+	if ($dat[0] != -1 && $dat[0] != 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+			($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+		} else {
+			print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
+			($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
+		}
+		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
+		}
+	}
+
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Add/substract time to the final date of a banishment of an account
+sub banaddaccount() {
+	my($userid, $modif) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "  <exemple> banadd nomtest +1m-2mn1s-6y\n";
+			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+			print "            et 6 ans dans le même temps.\n";
+		} else {
+			print "Please input an account name.\n";
+			print "  <example> banadd testname +1m-2mn1s-6y\n";
+			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
+			print "            and 6 years at the same time.\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	my($year, $month, $day) = (0, 0 ,0);
+	my($hour, $minute, $second) = (0, 0 ,0);
+
+	$modif = lc($modif);
+	while (length($modif) > 0) {
+		my($value) = int($modif);
+		if ($value == 0) {
+			$modif = substr($modif, 1);
+		} else {
+			if (substr($modif, 0, 1) =~ /[\-\+]/) {
+				$modif = substr($modif, 1);
+			}
+			while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
+				$modif = substr($modif, 1);
+			}
+			if (index($modif, "s") == 0) {
+				$second = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "mn") == 0) {
+				$minute = $value;
+				$modif = substr($modif, 2);
+			} elsif (index($modif, "h") == 0) {
+				$hour = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
+				$day = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "m") == 0) {
+				$month = $value;
+				$modif = substr($modif, 1);
+			} elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
+				$year = $value;
+				$modif = substr($modif, 1);
+			} else {
+				$modif = substr($modif, 1);
+			}
+		}
+	}
+
+	if ($defaultlanguage eq "F") {
+		print " année:   $year\n";
+		print " mois:    $month\n";
+		print " jour:    $day\n";
+		print " heure:   $hour\n";
+		print " minute:  $minute\n";
+		print " seconde: $second\n";
+	} else {
+		print " year:   $year\n";
+		print " month:  $month\n";
+		print " day:    $day\n";
+		print " hour:   $hour\n";
+		print " minute: $minute\n";
+		print " second: $second\n";
+	}
+
+	if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
+		if ($defaultlanguage eq "F") {
+			print "Vous devez entrer un ajustement avec cette commande, svp:\n";
+			print "  Valeur d'ajustement (-1, 1, +1, etc...)\n";
+			print "  Element modifié:\n";
+			print "    a ou y: année\n";
+			print "    m:      mois\n";
+			print "    j ou d: jour\n";
+			print "    h:      heure\n";
+			print "    mn:     minute\n";
+			print "    s:      seconde\n";
+			print "  <exemple> banadd nomtest +1m-2mn1s-6y\n";
+			print "            Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+			print "            et 6 ans dans le même temps.\n";
+		} else {
+			print "Please give an adjustment with this command:\n";
+			print "  Adjustment value (-1, 1, +1, etc...)\n";
+			print "  Modified element:\n";
+			print "    a or y: year\n";
+			print "    m: month\n";
+			print "    j or d: day\n";
+			print "    h: hour\n";
+			print "    mn: minute\n";
+			print "    s: second\n";
+			print "  <example> banadd testname +1m-2mn1s-6y\n";
+			print "            this example adds 1 month and 1 second, and substracts 2 minutes\n";
+			print "            and 6 years at the same time.\n";
+		}
+		return 137;
+	}
+	if ($year > 127 || $year < -127) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the years (from -127 to 127).\n";
+		}
+		return 137;
+	}
+	if ($month > 255 || $month < -255) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the months (from -255 to 255).\n";
+		}
+		return 137;
+	}
+	if ($day > 32767 || $day < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+	if ($hour > 32767 || $hour < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+	if ($minute > 32767 || $minute < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+	if ($second > 32767 || $second < -32767) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
+		} else {
+			print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
+		}
+		return 137;
+	}
+
+	print $so pack("va24vvvvvv", 0x794c, $userid, $year, $month, $day, $hour, $minute, $second);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x794d) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(32);
+	my(@dat) = unpack("Va24V", $buf);
+	while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+		chop($dat[1]);
+	};
+	if ($dat[0] == -1 || $dat[0] == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
+		}
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+			($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+		} else {
+			print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
+			($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
+		}
+		# localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+	}
+
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to displaying information about an account (by its name)
+sub whoaccount() {
+	my($userid) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> who nomtest\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> who testname\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+
+	print $so pack("va24", 0x7952, $userid);
+	$so->flush();
+
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7953) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 122;
+	}
+	my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
+	my($memo) = "";
+	if ($memo_size > 0) {
+		$memo = unpack("a".$memo_size, readso($memo_size));
+	}
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
+		chop($error_message);
+	};
+	while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
+		chop($last_login);
+	};
+	while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
+		chop($last_ip);
+	};
+	while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
+		chop($email);
+	};
+	while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
+		chop($memo);
+	};
+
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Impossible de trouver le compte [$userid]. Le compte n'existe pas.\n";
+		} else {
+			print "Unabled to find the account [$userid]. Account doesn't exist.\n";
+		}
+		return 123;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Le compte [$userid] a les caractéristiques suivantes:\n";
+		} else {
+			print "The account [$userid] is set with:\n";
+		}
+		if ($GM_level == 0) {
+			print " Id:     $id2 (non-GM)\n";
+		} else {
+			if ($defaultlanguage eq "F") {
+				print " Id:     $id2 (GM niveau $GM_level)\n";
+			} else {
+				print " Id:     $id2 (GM level $GM_level)\n";
+			}
+		}
+		if ($defaultlanguage eq "F") {
+			print " Nom:    '$name'\n";
+			print " Sexe:   ".("Femme", "Male", "Serveur")[$sex]."\n";
+		} else {
+			print " Name:   '$name'\n";
+			print " Sex:    ".("Female", "Male", "Server")[$sex]."\n";
+		}
+		print " E-mail: $email\n";
+		if ($status == 7) {
+			print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
+		} else {
+			print " Statut: $status [".(
+			      ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+			      "Unregistered ID",
+			      "Incorrect Password",
+			      "This ID is expired",
+			      "Rejected from Server",
+			      "You have been blocked by the GM Team",
+			      "Your Game's EXE file is not the latest version",
+			      "You are Prohibited to log in until %s",
+			      "Server is jammed due to over populated",
+			      "No MSG",
+			      "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
+		}
+		if ($defaultlanguage eq "F") {
+			print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
+			print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
+			print " Dernière connexion le: $last_login (ip: $last_ip)\n";
+			print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
+		} else {
+			print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
+			print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
+			print " Last connection at: $last_login (ip: $last_ip)\n";
+			print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
+		}
+		print " Memo:   '$memo'\n";
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to displaying information about an account (by its id)
+sub infoaccount() {
+	my($id) = @_;
+	if ($id < 0) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un id ayant une valeur positive svp.\n";
+		} else {
+			print "Please input a positive value for the id.\n";
+		}
+		return 136;
+	}
+
+	print $so pack("vV", 0x7954, $id);
+	$so->flush();
+
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x7953) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 122;
+	}
+	my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
+	my($memo) = "";
+	if ($memo_size > 0) {
+		$memo = unpack("a".$memo_size, readso($memo_size));
+	}
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
+		chop($error_message);
+	};
+	while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
+		chop($last_login);
+	};
+	while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
+		chop($last_ip);
+	};
+	while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
+		chop($email);
+	};
+	while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
+		chop($memo);
+	};
+
+	if (length($name) == 0 || $name eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
+		} else {
+			print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
+		}
+		return 123;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Le compte [id: $id2] a les caractéristiques suivantes:\n";
+		} else {
+			print "The account [id: $id2] is set with:\n";
+		}
+		if ($GM_level == 0) {
+			print " Id:     $id2 (non-GM)\n";
+		} else {
+			if ($defaultlanguage eq "F") {
+				print " Id:     $id2 (GM niveau $GM_level)\n";
+			} else {
+				print " Id:     $id2 (GM level $GM_level)\n";
+			}
+		}
+		if ($defaultlanguage eq "F") {
+			print " Nom:    '$name'\n";
+			print " Sexe:   ".("Femme", "Male", "Serveur")[$sex]."\n";
+		} else {
+			print " Name:   '$name'\n";
+			print " Sex:    ".("Female", "Male", "Server")[$sex]."\n";
+		}
+		print " E-mail: $email\n";
+		if ($status == 7) {
+			print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
+		} else {
+			print " Statut: $status [".(
+			      ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+			      "Unregistered ID",
+			      "Incorrect Password",
+			      "This ID is expired",
+			      "Rejected from Server",
+			      "You have been blocked by the GM Team",
+			      "Your Game's EXE file is not the latest version",
+			      "You are Prohibited to log in until %s",
+			      "Server is jammed due to over populated",
+			      "No MSG",
+			      "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
+		}
+		if ($defaultlanguage eq "F") {
+			print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
+			print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
+			print " Dernière connexion le: $last_login (ip: $last_ip)\n";
+			print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
+		} else {
+			print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
+			print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
+			print " Last connection at: $last_login (ip: $last_ip)\n";
+			print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
+		}
+		print " Memo:   '$memo'\n";
+	}
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Check the validity of a password
+# (Note: never send back a password with login-server!! security of passwords)
+sub checkaccount() {
+	my($userid, $passwd) = @_;
+	if ($userid eq "") {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un nom de compte svp.\n";
+			print "<exemple> check testname motdepasse\n";
+		} else {
+			print "Please input an account name.\n";
+			print "<example> check testname password\n";
+		}
+		return 136;
+	}
+	if (verify_accountname($userid) == 0) {
+		return 102;
+	}
+	if ($passwd eq "") {
+		return 134 if (($passwd = typepasswd()) eq "");
+	}
+	if (verify_password($passwd) == 0) {
+		return 131;
+	}
+	print $so pack("va24a24", 0x793a, $userid,$passwd);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x793b) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 132;
+	}
+	$buf = readso(28);
+	my($id2, $name) = unpack("Va24", $buf);
+	while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+		chop($name);
+	};
+	if ($id2 == -1 || $id2 == 4294967295) {
+		if ($defaultlanguage eq "F") {
+			print "Le compte [$userid] n'existe pas ou le mot de passe est incorrect.\n";
+		} else {
+			print "The account [$userid] doesn't exist or the password is incorrect.\n";
+		}
+		return 133;
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Le mot de passe donné correspond bien au compte [$name][id: $id2].\n";
+		} else {
+			print "The proposed password is correct for the account [$name][id: $id2].\n";
+		}
+	}
+	return 130;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to login-server to reload GM configuration file
+sub reloadGM() {
+	print $so pack("v", 0x7955);
+	$so->flush();
+	if ($defaultlanguage eq "F") {
+		print "Demande de recharger le fichier de configuration des GM envoyée.\n";
+		print "Vérifiez les comptes GM actuels (après rechargement):\n";
+	} else {
+		print "Request to reload the GM configuration file sended.\n";
+		print "Check the actual GM accounts (after reloading):\n";
+	}
+	&listaccount(0, 0, 1); # 1: to list only GM
+	return 180;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Send a broadcast message
+sub sendbroadcast() {
+	my($type, $message) = @_;
+	if ($message eq "" || length($message) == 0) {
+		if ($defaultlanguage eq "F") {
+			print "Entrez un message svp.\n";
+			if ($type == 0) {
+				print "<exemple> kami un message\n";
+			} else {
+				print "<exemple> kamib un message\n";
+			}
+		} else {
+			print "Please input a message.\n";
+			if ($type == 0) {
+				print "<example> kami a message\n";
+			} else {
+				print "<example> kamib a message\n";
+			}
+		}
+		return 136;
+	}
+
+	print $so pack("vvVa".length($message), 0x794e, $type, length($message), $message);
+	$so->flush();
+	$buf = readso(2);
+	if (unpack("v", $buf) != 0x794f) {
+		if ($defaultlanguage eq "F") {
+			print "Problème de connexion au serveur (réponse incorrecte).\n";
+		} else {
+			print "Connection error to the server (incorrect answer).\n";
+		}
+		return 152;
+	}
+	$buf = readso(2);
+	my($answer) = unpack("v", $buf);
+	if ($answer == -1 || $answer == 65535) {
+		if ($defaultlanguage eq "F") {
+			print "Echec de l'envoi du message. Aucun server de char en ligne.\n";
+		} else {
+			print "Message sending failed. No online char-server.\n";
+		}
+	} else {
+		if ($defaultlanguage eq "F") {
+			print "Message transmis au server de logins avec succès.\n";
+		} else {
+			print "Message successfully sended to login-server.\n";
+		}
+	}
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Change language of displaying
+sub changelanguage() {
+	my($language) = @_;
+	if ($language eq "" || length($language) == 0) {
+		if ($defaultlanguage == 'F') {
+			printf("Entrez une langue svp.\n");
+			printf("<exemple> language english\n");
+			printf("          language français\n");
+		} else {
+			printf("Please input a language.\n");
+			printf("<example> language english\n");
+			printf("          language français\n");
+		}
+		return 136;
+	}
+
+	$language = uc(substr($language, 0, 1));
+	if ($language =~ /^[EF]$/) {
+		$defaultlanguage = $language;
+		if ($defaultlanguage == 'F') {
+			printf("Changement de la langue d'affichage en Français.\n");
+		} else {
+			printf("Displaying language changed to English.\n");
+		}
+	} else {
+		if ($defaultlanguage == 'F') {
+			printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
+		} else {
+			printf("Undefined language (possible languages: Français or English).\n");
+		}
+	}
+
+	return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: sending 'end of connection' packet
+sub quit() {
+	print $so pack("v", 0x7532);
+	$so->flush();
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Get datas from the socket
+sub readso() {
+	my($len) = shift;
+	my($buf);
+	if (read($so, $buf, $len) < $len) {
+		if ($defaultlanguage eq "F") {
+			print "Erreur de lecture sur la Socket.\n";
+		} else {
+			print "Socket read error.\n";
+		}
+		exit(3);
+	}
+	return $buf;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Input of a password
+sub typepasswd {
+	my($passwd1, $passwd2);
+	cbreak();
+	if ($defaultlanguage eq "F") {
+		print "Entrez le mot de passe > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
+		print "Ré-entrez le mot de passe > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
+	} else {
+		print "Type the password > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
+		print "Verify the password > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
+	}
+	cooked();
+	if ($passwd1 ne $passwd2) {
+		if ($defaultlanguage eq "F") {
+			print "Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n";
+		} else {
+			print "Password verification failed. Please input same password.\n";
+		}
+		return "";
+	}
+	return $passwd1;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Return ordonal text of a number
+sub makeordinal {
+	my($c) = shift;
+	if ($defaultlanguage eq "F") {
+		if ($c < 1) {
+			return $c;
+		}
+		return $c.("er", "ème")[$c == 1 ? 0 : 1];
+	} else {
+		if ($c % 10 < 4 && $c % 10 != 0 && ($c < 10 || $c > 20)) {
+			return $c.("st","nd","rd")[$c % 10 - 1];
+		}
+		return $c."th";
+	}
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Test of the validity of an account name (return 0 if incorrect, and 1 if ok)
+sub verify_accountname {
+	my($account_name) = @_;       # Get the account_name
+	if ($account_name =~ /[\x00-\x1f]/) { # remove control char
+		my($c) = length($`) + 1;
+		if ($defaultlanguage eq "F") {
+			print "Caractère interdit trouvé dans le nom du compte (".makeordinal($c)." caractère).\n";
+		} else {
+			print "Illegal character found in the account name (".makeordinal($c)." character).\n";
+		}
+		return 0;
+	}
+	if (length($account_name) < 4) {
+		if ($defaultlanguage eq "F") {
+			print "Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n";
+		} else {
+			print "Account name is too short. Please input an account name of 4-23 bytes.\n";
+		}
+		return 0;
+	}
+	if (length($account_name) > 23) {
+		if ($defaultlanguage eq "F") {
+			print "Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n";
+		} else {
+			print "Account name is too long. Please input an account name of 4-23 bytes.\n";
+		}
+		return 0;
+	}
+	return 1;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
+sub verify_password {
+	my($password) = @_;       # Get the password
+	if ($password =~ /[\x00-\x1f]/) {
+		my($c) = length($`) + 1;
+		if ($defaultlanguage eq "F") {
+			print "Caractère interdit trouvé dans le mot de passe (".makeordinal($c)." caractère).\n";
+		} else {
+			print "Illegal character found in the password (".makeordinal($c)." character).\n";
+		}
+		return 0;
+	}
+	if (length($password) < 4) {
+		if ($defaultlanguage eq "F") {
+			print "Mot de passe trop court. Entrez un mot de passe de 4-23 caractères.\n";
+		} else {
+			print "Password is too short. Please input a password of 4-23 bytes.\n";
+		}
+		return 0;
+	}
+	if (length($password) > 23) {
+		if ($defaultlanguage eq "F") {
+			print "Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n";
+		} else {
+			print "Password is too long. Please input a password of 4-23 bytes.\n";
+		}
+		return 0;
+	}
+	return 1;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Test of the validity of an e-mail (return 0 if incorrect, and 1 if ok)
+sub verify_email {
+	my($email) = @_;       # Get the e-mail
+	# To ignore a '.' before the @ (wanadoo, a provider, do that)
+	$email =~ s/\.\@/\@/;
+	# If the e-mail is void, it's not correct -> return 0
+	if ($email eq '') {
+		return(0);
+	}
+	# If the e-mail have no "@", it's not correct -> return 0
+	if ($email !~ /\@/) {
+		return(0);
+	}
+	# If the e-mail have a ",", a space, a tab or a ";", it's not correct -> return 0
+	if ($email =~ /[\,|\s|\;]/) {
+		return(0)
+	};
+	# IF
+	#    (the e-mail contains 2 "@", or ".." or "@." or starts or finishes by a ".")
+	# OR IF
+	#    (the e-mail doesn't contain "@localhost" AND
+	# - it doesn't contain characters followed by "@" itself followed by letters itself followed by "." and 2 or more letters
+	# - or an IP address)
+	# -> so, it's not good ! (finish !)
+	if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/ ||
+		($email !~ /^.+\@localhost$/ &&
+		$email !~ /^.+\@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
+		return(0); # non-valid email
+	} else {
+		# If not, the e-email address is correct
+		return(1); # valid email
+	}
 }

+ 33 - 33
src/tool/mapcheck.sh

@@ -1,34 +1,34 @@
-#!/bin/sh
-echo "============================================"
-echo "=       map server status checker...       ="
-echo "============================================"
-./map-server.exe &
-sleep 40
-
-while [ 0 ]
-do
-	pcpu=` top -n 1| grep map-server | awk '{print $9}' | awk 'BEGIN{FS="."} {print $1}' ` 
-	if [ "$pcpu" -gt 80 ];then
-		echo "============================================"
-		echo "map server is more than 80% (now $pcpu%)"
-		echo "============================================"
-		ppid=` ps -a | grep map-server | awk '{print $1}' `
-		kill $ppid
-		./map-server.exe &
-		sleep 40
-	else
-		pmapct=` ps -a| grep map-server | wc -l `
-		if [ "$pmapct" -eq 0 ];then
-			echo "============================================"
-			echo "map server is not running..."
-			echo "restart map server..."
-			echo "============================================"
-			./map-server.exe &
-			sleep 40
-			#echo "test"
-		else
-			echo "map server is ok (now $pcpu%)..."
-			sleep 5
-		fi
-	fi
+#!/bin/sh
+echo "============================================"
+echo "=       map server status checker...       ="
+echo "============================================"
+./map-server.exe &
+sleep 40
+
+while [ 0 ]
+do
+	pcpu=` top -n 1| grep map-server | awk '{print $9}' | awk 'BEGIN{FS="."} {print $1}' ` 
+	if [ "$pcpu" -gt 80 ];then
+		echo "============================================"
+		echo "map server is more than 80% (now $pcpu%)"
+		echo "============================================"
+		ppid=` ps -a | grep map-server | awk '{print $1}' `
+		kill $ppid
+		./map-server.exe &
+		sleep 40
+	else
+		pmapct=` ps -a| grep map-server | wc -l `
+		if [ "$pmapct" -eq 0 ];then
+			echo "============================================"
+			echo "map server is not running..."
+			echo "restart map server..."
+			echo "============================================"
+			./map-server.exe &
+			sleep 40
+			#echo "test"
+		else
+			echo "map server is ok (now $pcpu%)..."
+			sleep 5
+		fi
+	fi
 done

+ 56 - 56
src/tool/mapchecker.sh

@@ -1,56 +1,56 @@
-#!/bin/bash
-
-athena_dir="/home/athena/658/"
-
-while [ true ] ; do
-
-if [ ` ps fauxw | grep map-server | grep -v grep | wc -l ` -eq 0 ];then
-        #echo `date` " -- map-server crashed - restarting"
-        echo `date` " -- map-server crashed - restarting" >> /var/log/athena_status.log
-        killall -9 map-server
-        cd $athena_dir
-        nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
-        sleep 240
-        #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
-fi
-
-
-if [ ` ps fauxw | grep map-server | grep -v grep | awk '{print $3}' | awk 'BEGIN{FS="."} {print $1}' ` -gt 10 ];then
-        #echo `date` " -- mapserver cpuload over 10 - restarting"
-        echo `date` " -- mapserver cpuload over 10 - restarting" >> /var/log/athena_status.log
-        killall -9 map-server
-        cd $athena_dir
-        nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
-        sleep 240
-        #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
-        #echo `date` " -- restarted"
-        echo `date` " -- restarted" >> /var/log/athena_status.log
-fi
-
-if [ ` ps fauxw | grep char-server | grep -v grep | wc -l ` -eq 0 ];then
-        #echo `date` " -- char server crashed - restarting"
-        echo `date` " -- char server crashed - restarting" >> /var/log/athena_status.log
-        killall -9 char-server
-        cd $athena_dir
-        nohup ./char-server ./conf/char_athena.conf ./conf/inter_athena.conf &
-        #echo `date` " -- restarted"
-        echo `date` " -- restarted" >> /var/log/athena_status.log
-
-fi
-
-if [ ` ps fauxw | grep login-server | grep -v grep | wc -l ` -eq 0 ];then
-        #echo `date` " -- login server crashed - restarting"
-        echo `date` " -- login server crashed - restarting" >> /var/log/athena_status.log
-        killall -9 login-server
-        cd $athena_dir
-        nohup ./login-server ./conf/login_athena.conf &
-        #echo `date` " -- restarted"
-        echo `date` " -- restarted" >> /var/log/athena_status.log
-
-fi
-
-
-#echo `date` " -- everything is fine"
-echo `date` " -- everything is fine" >> /var/log/athena_status.log
-sleep 30
-done
+#!/bin/bash
+
+athena_dir="/home/athena/658/"
+
+while [ true ] ; do
+
+if [ ` ps fauxw | grep map-server | grep -v grep | wc -l ` -eq 0 ];then
+        #echo `date` " -- map-server crashed - restarting"
+        echo `date` " -- map-server crashed - restarting" >> /var/log/athena_status.log
+        killall -9 map-server
+        cd $athena_dir
+        nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
+        sleep 240
+        #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
+fi
+
+
+if [ ` ps fauxw | grep map-server | grep -v grep | awk '{print $3}' | awk 'BEGIN{FS="."} {print $1}' ` -gt 10 ];then
+        #echo `date` " -- mapserver cpuload over 10 - restarting"
+        echo `date` " -- mapserver cpuload over 10 - restarting" >> /var/log/athena_status.log
+        killall -9 map-server
+        cd $athena_dir
+        nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
+        sleep 240
+        #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
+        #echo `date` " -- restarted"
+        echo `date` " -- restarted" >> /var/log/athena_status.log
+fi
+
+if [ ` ps fauxw | grep char-server | grep -v grep | wc -l ` -eq 0 ];then
+        #echo `date` " -- char server crashed - restarting"
+        echo `date` " -- char server crashed - restarting" >> /var/log/athena_status.log
+        killall -9 char-server
+        cd $athena_dir
+        nohup ./char-server ./conf/char_athena.conf ./conf/inter_athena.conf &
+        #echo `date` " -- restarted"
+        echo `date` " -- restarted" >> /var/log/athena_status.log
+
+fi
+
+if [ ` ps fauxw | grep login-server | grep -v grep | wc -l ` -eq 0 ];then
+        #echo `date` " -- login server crashed - restarting"
+        echo `date` " -- login server crashed - restarting" >> /var/log/athena_status.log
+        killall -9 login-server
+        cd $athena_dir
+        nohup ./login-server ./conf/login_athena.conf &
+        #echo `date` " -- restarted"
+        echo `date` " -- restarted" >> /var/log/athena_status.log
+
+fi
+
+
+#echo `date` " -- everything is fine"
+echo `date` " -- everything is fine" >> /var/log/athena_status.log
+sleep 30
+done

+ 20 - 20
src/webserver/Makefile

@@ -1,20 +1,20 @@
-all:
-	#Generate framework...
-	$(CC) -c parse.c
-	$(CC) -c generate.c
-	$(CC) -c htmlstyle.c
-	$(CC) -c logs.c
-	
-	#Generate "pages"...
-	cd pages && $(CC) -c about.c && cd ..
-	cd pages && $(CC) -c sample.c && cd ..
-	cd pages && $(CC) -c notdone.c && cd ..
-
-	#Building the server...
-	$(CC) -o webserver main.c parse.o generate.o htmlstyle.o \
-	logs.o pages/about.o pages/sample.o pages/notdone.o
-
-clean:
-	rm -f *.o
-	rm -f pages/*.o
-	rm -f webserver
+all:
+	#Generate framework...
+	$(CC) -c parse.c
+	$(CC) -c generate.c
+	$(CC) -c htmlstyle.c
+	$(CC) -c logs.c
+	
+	#Generate "pages"...
+	cd pages && $(CC) -c about.c && cd ..
+	cd pages && $(CC) -c sample.c && cd ..
+	cd pages && $(CC) -c notdone.c && cd ..
+
+	#Building the server...
+	$(CC) -o webserver main.c parse.o generate.o htmlstyle.o \
+	logs.o pages/about.o pages/sample.o pages/notdone.o
+
+clean:
+	rm -f *.o
+	rm -f pages/*.o
+	rm -f webserver

+ 50 - 50
src/webserver/doc/API.txt

@@ -1,50 +1,50 @@
-Here's the webserver API, so you can work on the webserver.
-
-My personal goal is to make this interface simple, so that coding it
-will be like coding in some scripting language...
-
-
-
-char *get_param(char in_string[500], char swhat[500]);
-
-This function simply returns various data from the query string.
-	*Pass get_param NOTHING longer than 500 in length!
-
-	What do I pass where in_string is?
-		The query string.
-
-	What do I pass where swhat is?
-		One of two things...
-		Either 0 for the path of the 'page'
-		or you can pass it the param you wish to lookup. 
-
-
-
-
-
-
-char *get_query(char *inquery);
-
-This function simply returns a query string from the raw server request.
-This is used once in main, I doubt you'll need it.
-
-
-
-
-
-void web_send(int sockin, char *in_data);
-
-Super easy way of sending data to a webpage!
-Simply put in the socket name and then the data.
-
-	Ex:
-		web_send(socket, "I like cheese!\n");
-
-
-
-
-char *html_header(char* title);
-Easy way to print the eAthena header for the server.
-
-	Ex:
-		web_send(sockethere, html_header("About"));
+Here's the webserver API, so you can work on the webserver.
+
+My personal goal is to make this interface simple, so that coding it
+will be like coding in some scripting language...
+
+
+
+char *get_param(char in_string[500], char swhat[500]);
+
+This function simply returns various data from the query string.
+	*Pass get_param NOTHING longer than 500 in length!
+
+	What do I pass where in_string is?
+		The query string.
+
+	What do I pass where swhat is?
+		One of two things...
+		Either 0 for the path of the 'page'
+		or you can pass it the param you wish to lookup. 
+
+
+
+
+
+
+char *get_query(char *inquery);
+
+This function simply returns a query string from the raw server request.
+This is used once in main, I doubt you'll need it.
+
+
+
+
+
+void web_send(int sockin, char *in_data);
+
+Super easy way of sending data to a webpage!
+Simply put in the socket name and then the data.
+
+	Ex:
+		web_send(socket, "I like cheese!\n");
+
+
+
+
+char *html_header(char* title);
+Easy way to print the eAthena header for the server.
+
+	Ex:
+		web_send(sockethere, html_header("About"));

+ 11 - 11
src/webserver/doc/README

@@ -1,11 +1,11 @@
-This readme is intended for the programmers of eAthena.
-
-This webserver's apis are in API.txt.
-
-To make this simple, generate.c should handle most of the work this sever does
-in terms of what people see.
-
-When a request is made the server shoots it off to generate.c.
-
-You are welcome to create more functions used by generate.c to generate pages
-though, so don't feel limited by that one file.
+This readme is intended for the programmers of eAthena.
+
+This webserver's apis are in API.txt.
+
+To make this simple, generate.c should handle most of the work this sever does
+in terms of what people see.
+
+When a request is made the server shoots it off to generate.c.
+
+You are welcome to create more functions used by generate.c to generate pages
+though, so don't feel limited by that one file.

+ 38 - 38
src/webserver/generate.c

@@ -1,38 +1,38 @@
-
-void generate_page(char password[25], int sock_in, char *query, char *ip)
-{
-	char *page = get_param(query, 0);
-	char *ppass = get_param(query, "password");
-
-
-	if ( (ppass == 0) || (strcmp(password, ppass) != 0) )
-	{
-		web_send(sock_in, html_header("Enter your password"));
-		web_send(sock_in, "<H1>NOT LOGGED IN!</H1><form action=\"/\" method=\"GET\">\n");
-                web_send(sock_in, "Enter your password:<br>\n<input type=\"text\" name=\"password\">\n");
-                web_send(sock_in, "<input type=\"submit\" value=\"Login\">\n");
-	}
-	else
-	{
-
-
-		//To make this simple, we will have a bunch of if statements
-		//that then shoot out data off into functions.
-
-	
-		//The 'index'
-		if ( strcmp(page, "/") == 0 )
-			generate_notdone(sock_in, query, ip);
-
-
-		//About page:
-		if ( strcmp(page, "/about.html") == 0 )
-			generate_about(sock_in, query, ip);
-
-	
-		//Test page:
-		if ( strcmp(page, "/testing/") == 0 )
-			generate_sample(sock_in, query, ip);
-
-	}
-}
+
+void generate_page(char password[25], int sock_in, char *query, char *ip)
+{
+	char *page = get_param(query, 0);
+	char *ppass = get_param(query, "password");
+
+
+	if ( (ppass == 0) || (strcmp(password, ppass) != 0) )
+	{
+		web_send(sock_in, html_header("Enter your password"));
+		web_send(sock_in, "<H1>NOT LOGGED IN!</H1><form action=\"/\" method=\"GET\">\n");
+                web_send(sock_in, "Enter your password:<br>\n<input type=\"text\" name=\"password\">\n");
+                web_send(sock_in, "<input type=\"submit\" value=\"Login\">\n");
+	}
+	else
+	{
+
+
+		//To make this simple, we will have a bunch of if statements
+		//that then shoot out data off into functions.
+
+	
+		//The 'index'
+		if ( strcmp(page, "/") == 0 )
+			generate_notdone(sock_in, query, ip);
+
+
+		//About page:
+		if ( strcmp(page, "/about.html") == 0 )
+			generate_about(sock_in, query, ip);
+
+	
+		//Test page:
+		if ( strcmp(page, "/testing/") == 0 )
+			generate_sample(sock_in, query, ip);
+
+	}
+}

+ 51 - 51
src/webserver/htmlstyle.c

@@ -1,51 +1,51 @@
-char output[10000];
-
-char *html_header(char *title)
-{
-	memset(output, 0x0, 10000);
-	char *text = "<body text=\"#000000\" bgcolor=\"#939393\" link=\"#0033FF\">\n"
-	"<br><table width=\"92%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\"\n"
-	"align=\"center\" class=\"bordercolor\"><tbody><tr><td class=\"bordercolor\" width=\"100%\">\n"
-	"<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n"
-	"<tbody><tr><td><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n"
-	"<tbody><tr><img src=\"http://eathena.sourceforge.net/athena.jpg\" alt=\"Athena\">\n"
-	"<td bgcolor=\"#ffffff\"></td></tr></tbody></table></td></tr></tbody></table>\n"
-	"</td></tr><tr align=\"left\"><td class=\"bordercolor\"><table bgcolor=\"#c6c6c6\" width=\"100%\" cellspacing=\"0\"\n"
-	"cellpadding=\"0\" style=\"text-align: left; margin-right: auto; margin-left: 0px;\">\n";
-        "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"3\"\n"
- 	"cellspacing=\"0\" bgcolor=\"#c6c6c6\" align=\"center\"><tbody><tr>"
-	"<td valign=\"middle\" bgcolor=\"#c6c6c6\" align=\"center\"><a href=\"/cgi-bin/forum/YaBB.cgi\">"
-	"<span style=\"text-decoration: underline;\"><span style=\"font-weight: bold;\">\n"
-	"To the Forum</span></span></a><br></td></tr></tbody></table></td></tr></tbody>\n"
-	"</table></td></tr><tr><td class=\"bordercolor\" align=\"center\">\n"
-	"<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n"
-        "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"5\"\n"
-	"cellspacing=\"0\" bgcolor=\"#ffffff\" align=\"center\"><tbody><tr>\n"
-        "<td valign=\"middle\" bgcolor=\"#ffffff\" align=\"center\"><font size=\"2\" color=\"#6e94b7\">\n"
-	"<b>Athena</b> &laquo; Portal &raquo;</font></td></tr></tbody></table></td></tr></tbody>"
-        "</table></td></tr></tbody></table>\n";
-
-	sprintf(output, "<title>%s</title>\n%s\n", title, text);
-
-	return output;
-}
-
-
-
-char *html_start_form(char *location, char *action)
-{
-	memset(output, 0x0, 10000);
-	sprintf(output, "<form action=\"%s\" method=\"%s\">", location, action);
-	return output;
-
-
-}
-
-
-char *html_end_forum(void)
-{
-	return "</form>";
-}
-
-
-
+char output[10000];
+
+char *html_header(char *title)
+{
+	memset(output, 0x0, 10000);
+	char *text = "<body text=\"#000000\" bgcolor=\"#939393\" link=\"#0033FF\">\n"
+	"<br><table width=\"92%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\"\n"
+	"align=\"center\" class=\"bordercolor\"><tbody><tr><td class=\"bordercolor\" width=\"100%\">\n"
+	"<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n"
+	"<tbody><tr><td><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n"
+	"<tbody><tr><img src=\"http://eathena.sourceforge.net/athena.jpg\" alt=\"Athena\">\n"
+	"<td bgcolor=\"#ffffff\"></td></tr></tbody></table></td></tr></tbody></table>\n"
+	"</td></tr><tr align=\"left\"><td class=\"bordercolor\"><table bgcolor=\"#c6c6c6\" width=\"100%\" cellspacing=\"0\"\n"
+	"cellpadding=\"0\" style=\"text-align: left; margin-right: auto; margin-left: 0px;\">\n";
+        "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"3\"\n"
+ 	"cellspacing=\"0\" bgcolor=\"#c6c6c6\" align=\"center\"><tbody><tr>"
+	"<td valign=\"middle\" bgcolor=\"#c6c6c6\" align=\"center\"><a href=\"/cgi-bin/forum/YaBB.cgi\">"
+	"<span style=\"text-decoration: underline;\"><span style=\"font-weight: bold;\">\n"
+	"To the Forum</span></span></a><br></td></tr></tbody></table></td></tr></tbody>\n"
+	"</table></td></tr><tr><td class=\"bordercolor\" align=\"center\">\n"
+	"<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n"
+        "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"5\"\n"
+	"cellspacing=\"0\" bgcolor=\"#ffffff\" align=\"center\"><tbody><tr>\n"
+        "<td valign=\"middle\" bgcolor=\"#ffffff\" align=\"center\"><font size=\"2\" color=\"#6e94b7\">\n"
+	"<b>Athena</b> &laquo; Portal &raquo;</font></td></tr></tbody></table></td></tr></tbody>"
+        "</table></td></tr></tbody></table>\n";
+
+	sprintf(output, "<title>%s</title>\n%s\n", title, text);
+
+	return output;
+}
+
+
+
+char *html_start_form(char *location, char *action)
+{
+	memset(output, 0x0, 10000);
+	sprintf(output, "<form action=\"%s\" method=\"%s\">", location, action);
+	return output;
+
+
+}
+
+
+char *html_end_forum(void)
+{
+	return "</form>";
+}
+
+
+

+ 8 - 8
src/webserver/logs.c

@@ -1,8 +1,8 @@
-#include <time.h>
-
-void log_visit(char *query, char *ip)
-{
-	time_t timer;
-	timer=time(NULL);
-	printf("%s - \"%s\" - %s", ip, query, asctime(localtime(&timer)));
-}
+#include <time.h>
+
+void log_visit(char *query, char *ip)
+{
+	time_t timer;
+	timer=time(NULL);
+	printf("%s - \"%s\" - %s", ip, query, asctime(localtime(&timer)));
+}

+ 142 - 142
src/webserver/main.c

@@ -1,142 +1,142 @@
-/***************************************************************************
-                                description
-                             -------------------
-    author               : (C) 2004 by Michael J. Flickinger
-    email                : mjflick@cpan.org
-
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- ***************************************************************************/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/wait.h>
-#include <signal.h>
-
-#define BLOG 10
-
-char *header = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n";
-char recvin[500], password[25];
-int s_port;
-
-void sigchld_handler(int s)
-{
-	while(wait(NULL) > 0);
-}
-
-int main(int argc, char **argv)
-{
-	if (argc < 3)
-	{
-		printf("eAthena Web Server\n");
-		printf("usage: %s [password] [port]\n", argv[0]);
-		exit(0);
-	}
-
-	s_port = atoi(argv[2]);
-
-	if ((s_port < 1) || (s_port > 65534))
-	{
-		printf("Error: The port you choose is not valid port.\n");
-		exit(0);
-	} 
-
-	if (strlen(argv[1]) > 25)
-	{
-		printf("Error: Your password is too long.\n");
-		printf("It must be shorter than 25 characters.\n");
-		exit(0);
-	}
-
-	memset(password, 0x0, 25);
-	memcpy(password, argv[1], strlen(argv[1]));
-
-	int sockfd, new_fd;
-	struct sockaddr_in my_addr;
-	struct sockaddr_in their_addr;
-	int sin_size;
-
-	struct sigaction sa;
-
-	int yes=1;
-
-	if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1)
-	{
-		perror("Darn, this is broken.");
-		exit(0);
-	}
-
-	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
-	{
-		perror("Error... :-(");
-	}
-
-	//Now we know we have a working socket. :-)
-
-	my_addr.sin_family = AF_INET;
-	my_addr.sin_port = htons(s_port);
-	my_addr.sin_addr.s_addr = INADDR_ANY;
-	memset(&(my_addr.sin_zero), '\0', 8);
-
-	if ( bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
-	{
-		perror("can not bind to this port");
-		exit(0);
-	}
-
-	if ( listen(sockfd, BLOG) == -1)
-	{
-		perror("can not listen on port");
-		exit(0);
-	}
-
-	sa.sa_handler = sigchld_handler;
-
-	sigemptyset(&sa.sa_mask);
-	sa.sa_flags = SA_RESTART;
-
-	if (sigaction(SIGCHLD, &sa, NULL) == -1)
-	{
-		perror("sigaction sucks");
-		exit(0);
-	}
-
-	printf("The eAthena webserver is up and listening on port %i.\n", s_port);
-
-	while(1)
-	{
-		sin_size = sizeof(struct sockaddr_in);
-		new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
-
-		if (!fork())
-		{
-			close(sockfd);
-			memset(recvin, 0x0, 500);
-			recv(new_fd, recvin, 500, 0);
-			send(new_fd, header, strlen(header), 0);
-			generate_page(password, new_fd, get_query(recvin), inet_ntoa(their_addr.sin_addr));
-			log_visit(get_query(recvin), inet_ntoa(their_addr.sin_addr));
-
-			close(new_fd);
-			exit(0);
-		}
-		close(new_fd);	
-	}
-
-	return 0;
-}
+/***************************************************************************
+                                description
+                             -------------------
+    author               : (C) 2004 by Michael J. Flickinger
+    email                : mjflick@cpan.org
+
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/wait.h>
+#include <signal.h>
+
+#define BLOG 10
+
+char *header = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n";
+char recvin[500], password[25];
+int s_port;
+
+void sigchld_handler(int s)
+{
+	while(wait(NULL) > 0);
+}
+
+int main(int argc, char **argv)
+{
+	if (argc < 3)
+	{
+		printf("eAthena Web Server\n");
+		printf("usage: %s [password] [port]\n", argv[0]);
+		exit(0);
+	}
+
+	s_port = atoi(argv[2]);
+
+	if ((s_port < 1) || (s_port > 65534))
+	{
+		printf("Error: The port you choose is not valid port.\n");
+		exit(0);
+	} 
+
+	if (strlen(argv[1]) > 25)
+	{
+		printf("Error: Your password is too long.\n");
+		printf("It must be shorter than 25 characters.\n");
+		exit(0);
+	}
+
+	memset(password, 0x0, 25);
+	memcpy(password, argv[1], strlen(argv[1]));
+
+	int sockfd, new_fd;
+	struct sockaddr_in my_addr;
+	struct sockaddr_in their_addr;
+	int sin_size;
+
+	struct sigaction sa;
+
+	int yes=1;
+
+	if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1)
+	{
+		perror("Darn, this is broken.");
+		exit(0);
+	}
+
+	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
+	{
+		perror("Error... :-(");
+	}
+
+	//Now we know we have a working socket. :-)
+
+	my_addr.sin_family = AF_INET;
+	my_addr.sin_port = htons(s_port);
+	my_addr.sin_addr.s_addr = INADDR_ANY;
+	memset(&(my_addr.sin_zero), '\0', 8);
+
+	if ( bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
+	{
+		perror("can not bind to this port");
+		exit(0);
+	}
+
+	if ( listen(sockfd, BLOG) == -1)
+	{
+		perror("can not listen on port");
+		exit(0);
+	}
+
+	sa.sa_handler = sigchld_handler;
+
+	sigemptyset(&sa.sa_mask);
+	sa.sa_flags = SA_RESTART;
+
+	if (sigaction(SIGCHLD, &sa, NULL) == -1)
+	{
+		perror("sigaction sucks");
+		exit(0);
+	}
+
+	printf("The eAthena webserver is up and listening on port %i.\n", s_port);
+
+	while(1)
+	{
+		sin_size = sizeof(struct sockaddr_in);
+		new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
+
+		if (!fork())
+		{
+			close(sockfd);
+			memset(recvin, 0x0, 500);
+			recv(new_fd, recvin, 500, 0);
+			send(new_fd, header, strlen(header), 0);
+			generate_page(password, new_fd, get_query(recvin), inet_ntoa(their_addr.sin_addr));
+			log_visit(get_query(recvin), inet_ntoa(their_addr.sin_addr));
+
+			close(new_fd);
+			exit(0);
+		}
+		close(new_fd);	
+	}
+
+	return 0;
+}

+ 6 - 6
src/webserver/pages/about.c

@@ -1,6 +1,6 @@
-void generate_about(int sock_in, char *query, char *ip)
-{
-//printf("%s", html_header("About"));
-	web_send(sock_in, html_header("About"));
-	web_send(sock_in, "<center>eAthena Web Server!</center>\n");	
-}
+void generate_about(int sock_in, char *query, char *ip)
+{
+//printf("%s", html_header("About"));
+	web_send(sock_in, html_header("About"));
+	web_send(sock_in, "<center>eAthena Web Server!</center>\n");	
+}

+ 5 - 5
src/webserver/pages/notdone.c

@@ -1,5 +1,5 @@
-void generate_notdone(int sock_in, char *query, char *ip)
-{
-	web_send(sock_in, "<title>Not here!</title>\n");
-	web_send(sock_in, "<h2><center>This page/feature is not done yet.</center>\n</h2>");	
-}
+void generate_notdone(int sock_in, char *query, char *ip)
+{
+	web_send(sock_in, "<title>Not here!</title>\n");
+	web_send(sock_in, "<h2><center>This page/feature is not done yet.</center>\n</h2>");	
+}

+ 24 - 24
src/webserver/pages/sample.c

@@ -1,24 +1,24 @@
-
-
-void generate_sample(int sock_in, char *query, char *ip)
-{
-
-	char *name = get_param(query, "name");
-
-	web_send(sock_in, "<title>SAMPLE</title>\n");
-
-
-	//If a name was not entered...
-	if ( name == '\0' )
-	{
-		web_send(sock_in, "<form action=\"/testing/\" method=\"GET\">\n");
-		web_send(sock_in, "<input type=\"text\" name=\"name\">\n");
-		web_send(sock_in, "<input type=\"submit\">\n");
-	}
-	else
-	{
-		web_send(sock_in, "Your name is: ");
-		web_send(sock_in, get_param(query, "name"));
-	}
-printf("OK!\n");
-}
+
+
+void generate_sample(int sock_in, char *query, char *ip)
+{
+
+	char *name = get_param(query, "name");
+
+	web_send(sock_in, "<title>SAMPLE</title>\n");
+
+
+	//If a name was not entered...
+	if ( name == '\0' )
+	{
+		web_send(sock_in, "<form action=\"/testing/\" method=\"GET\">\n");
+		web_send(sock_in, "<input type=\"text\" name=\"name\">\n");
+		web_send(sock_in, "<input type=\"submit\">\n");
+	}
+	else
+	{
+		web_send(sock_in, "Your name is: ");
+		web_send(sock_in, get_param(query, "name"));
+	}
+printf("OK!\n");
+}

+ 135 - 135
src/webserver/parse.c

@@ -1,135 +1,135 @@
-#include <stdlib.h>
-
-char filtered_query[2000];
-char rdata[500];
-char param_n[500];
-char param_d[500];
-
-
-char *get_query(char *inquery)
-{
-	memset(filtered_query, 0x0, 2000);
-	sscanf(inquery, "GET %s %[$]", filtered_query);
-	return(filtered_query);
-}
-
-void web_send(int sockin, char *in_data)
-{
-	send(sockin, in_data, strlen(in_data), 0);
-}
-
-
-//THIS IS BAD CODE BE CAREFULL WITH IT!
-//Watch out for buffer overflow...
-//When using please make sure to check the string size.
-
-//Also note:
-//I take no pride in this code, it is a really bad way of doing this...
-char *get_param(char in_string[500], char swhat[500])
-{
-	int i = 0;
-	int marker, iswitch, pint, dint;
-	char flux[500];
-	memset(flux, 0x0, 500);
-
-	//Get the path of out "page"
-	if (swhat == 0)
-	{
-		//while i is not equal to array size
-		while (i != 500)
-		{
-			//if there is a question mark, halt!
-			if (in_string[i] == '?')
-			{
-				i = 499;
-			}
-			else 
-				rdata[i] = in_string[i];
-	
-			i++;
-		}
-		return rdata;
-	}
-	else //so, we want a param...
-	{
-		//calculate where param begins
-		while (i != 500)
-		{
-			if (in_string[i] == '?')
-			{
-				marker = i + 1;
-				i = 499;
-			}
-			i++;
-		}
-
-		i = 0;
-
-		//keep morons from trying to crash this
-		if ((marker > 500)||(marker < 1))
-			marker = 500;
-
-		while(marker != 500)
-		{
-			if ((in_string[marker] != '&') && (in_string[marker] != '\0'))
-			{
-				flux[i] = in_string[marker];
-				i++;
-			}
-			else
-			{
-
-				//we have a param, now we must dig through it
-
-				//clear temp vars
-				memset(param_n, 0x0, 500);
-				memset(param_d, 0x0, 500);
-				iswitch = 0;
-				pint = 0;
-				dint = 0;
-				i = 0;
-
-				//split result into param_n and param_d
-				while(i != 500)
-				{
-					if ( (flux[i] != '=') && (flux[i] != '\0') )
-					{
-						if (iswitch == 0)
-						{
-							param_n[pint] = flux[i];
-							pint++;
-						}
-						else
-						{
-							param_d[dint] = flux[i];
-							dint++;
-						}
-					}
-					else
-					{
-						iswitch = 1;
-					}
-					if (flux[i] == '\0')
-						i = 499;
-
-					i++;
-				}
-
-				if ( strcmp(param_n, swhat) == 0 )
-				{
-					return param_d;
-				}
-
-				i = 0;
-			}
-			
-			if (in_string[marker] == '\0')
-			{
-				marker = 499;
-			}
-			marker++;
-		}
-		return 0;
-	}
-}
-			
+#include <stdlib.h>
+
+char filtered_query[2000];
+char rdata[500];
+char param_n[500];
+char param_d[500];
+
+
+char *get_query(char *inquery)
+{
+	memset(filtered_query, 0x0, 2000);
+	sscanf(inquery, "GET %s %[$]", filtered_query);
+	return(filtered_query);
+}
+
+void web_send(int sockin, char *in_data)
+{
+	send(sockin, in_data, strlen(in_data), 0);
+}
+
+
+//THIS IS BAD CODE BE CAREFULL WITH IT!
+//Watch out for buffer overflow...
+//When using please make sure to check the string size.
+
+//Also note:
+//I take no pride in this code, it is a really bad way of doing this...
+char *get_param(char in_string[500], char swhat[500])
+{
+	int i = 0;
+	int marker, iswitch, pint, dint;
+	char flux[500];
+	memset(flux, 0x0, 500);
+
+	//Get the path of out "page"
+	if (swhat == 0)
+	{
+		//while i is not equal to array size
+		while (i != 500)
+		{
+			//if there is a question mark, halt!
+			if (in_string[i] == '?')
+			{
+				i = 499;
+			}
+			else 
+				rdata[i] = in_string[i];
+	
+			i++;
+		}
+		return rdata;
+	}
+	else //so, we want a param...
+	{
+		//calculate where param begins
+		while (i != 500)
+		{
+			if (in_string[i] == '?')
+			{
+				marker = i + 1;
+				i = 499;
+			}
+			i++;
+		}
+
+		i = 0;
+
+		//keep morons from trying to crash this
+		if ((marker > 500)||(marker < 1))
+			marker = 500;
+
+		while(marker != 500)
+		{
+			if ((in_string[marker] != '&') && (in_string[marker] != '\0'))
+			{
+				flux[i] = in_string[marker];
+				i++;
+			}
+			else
+			{
+
+				//we have a param, now we must dig through it
+
+				//clear temp vars
+				memset(param_n, 0x0, 500);
+				memset(param_d, 0x0, 500);
+				iswitch = 0;
+				pint = 0;
+				dint = 0;
+				i = 0;
+
+				//split result into param_n and param_d
+				while(i != 500)
+				{
+					if ( (flux[i] != '=') && (flux[i] != '\0') )
+					{
+						if (iswitch == 0)
+						{
+							param_n[pint] = flux[i];
+							pint++;
+						}
+						else
+						{
+							param_d[dint] = flux[i];
+							dint++;
+						}
+					}
+					else
+					{
+						iswitch = 1;
+					}
+					if (flux[i] == '\0')
+						i = 499;
+
+					i++;
+				}
+
+				if ( strcmp(param_n, swhat) == 0 )
+				{
+					return param_d;
+				}
+
+				i = 0;
+			}
+			
+			if (in_string[marker] == '\0')
+			{
+				marker = 499;
+			}
+			marker++;
+		}
+		return 0;
+	}
+}
+