Einige Hinweise:
- Data, die über den Chat reinkommt, besitzt auch Anführungszeichen. Diese müssen vorher mit strstripquotes entfernt werden.
- strstrx, strchr haben als Rückgabewert -1, wenn keine Übereinstimmung gefunden wird.
- strcmp, strncmp sind == 0, bei Übereinstimmung
Und hier mal meine Idee für den Liga-Manager
Er ist flexibel aufgebaut und ich denke, entsprechend erweiterbar.
Er besitzt sogar einen 2-Dim Array für die Keywords
Angedacht wären dann z.B. Befehle wie changename, changeemail oder sowas.
Code:
/*
SDAL - LIGA MANAGER
--------------------
Reagiert auf Chateingaben mit dem Schlüsselwort: "liga".
Die Befehle werden im Array g_Keywords hinterlegt.
Übereinstimmende Befehle werden an die Funktion exec_keyword weitergeleitet,
welche dann die Daten an die entsprechende Befehls-Funktion übergibt.
*/
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
#include <plugin>
new STRING_VERSION[MAX_DATA_LENGTH] = "0.8";
new g_RegistrationFile[MAX_TEXT_LENGTH]="addons/adminmod/config/liga_register.txt";
#define MAX_KEYWORDS 2
#define HELPME 0
#define REGISTER 1
new g_Keywords[MAX_KEYWORDS][15]={"help","register"};
public plugin_init() {
plugin_registerinfo("LIGA MANAGER","Reagiert auf Liga-Befehle, die im Chat abgegeben werden.",STRING_VERSION);
plugin_registercmd("say","HandleSay",ACCESS_ALL);
plugin_registerhelp("say",ACCESS_ALL,"say: liga <help> : Befehlsuebersicht der Liga");
plugin_registerhelp("say",ACCESS_ALL,"say: liga <register> <email_adresse>: Anmeldung zur Liga");
return PLUGIN_CONTINUE;
}
/**************************/
/*CHAT-EINGABE-ÜBERPRÜFUNG*/
/**************************/
public HandleSay(HLCommand,HLData,HLUserName,UserIndex){
new Data[MAX_DATA_LENGTH];
new Text[MAX_TEXT_LENGTH];
new User[MAX_NAME_LENGTH];
new First[5];
new KeyWord[10];
new DataEnter[MAX_TEXT_LENGTH];
new i;
convert_string(HLData,Data,MAX_DATA_LENGTH);
strstripquotes(Data);
if(strncmp(Data,"liga",4)==0){
convert_string(HLUserName,User,MAX_NAME_LENGTH);
strsep(Data," ",First,5,KeyWord,10,DataEnter,MAX_TEXT_LENGTH);
for(i=0;i<MAX_KEYWORDS;i++){
if(strcmp(KeyWord,g_Keywords[i])==0){
exec_keyword(DataEnter,User,i);
return PLUGIN_HANDLED;
break;
}
}
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Sorry, %s! Aber der Befehl ^"%s^" steht nicht zur Verfuegung!",User,KeyWord);
messageex(User,Text,print_chat);
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Bitte gib ^"liga help^" im Chat fuer weitere Informationen ein!");
messageex(User,Text,print_chat);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
/********************/
/*FUNKTIONS-ÜBERGABE*/
/********************/
exec_keyword(Data[],User[],KeyID){
switch(KeyID){
case HELPME: helpme(User);
case REGISTER: registration(Data,User);
}
}
/*************************/
/*Liga Befehls-Funktionen*/
/*************************/
/*HELP: LIGA-BEFEHLSÜBERSICHT*/
helpme(User[]){
new Text[MAX_TEXT_LENGTH];
new i;
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Hallo %s, dir stehen folgende Befehle mit dem Schluesslwort ^"liga^" zur Verfuegung:",User);
messageex(User,Text,print_chat);
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-BEFEHLE]: ");
for(i=0;i<MAX_KEYWORDS;i++){
strcat(Text,"^"",MAX_TEXT_LENGTH);
strcat(Text,g_Keywords[i],MAX_TEXT_LENGTH);
strcat(Text,"^" ",MAX_TEXT_LENGTH);
}
messageex(User,Text,print_chat);
}
/*REGISTRIERUNGS-FUNKTION*/
registration(Data[],User[]){
new Text[MAX_TEXT_LENGTH];
new AuthID[MAX_AUTHID_LENGTH];
new FileData[MAX_DATA_LENGTH];
new i;
new iFileSize;
new error;
if(strlen(Data)==0 || strchr(Data, '@')==-1){
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Sorry, %s! Aber die Email-Adresse ^"%s^" scheint nicht gueltig zu sein!",User,Data);
error=1;
}else{
get_userAuthID(User,AuthID,MAX_AUTHID_LENGTH);
iFileSize=filesize(g_RegistrationFile);
for(i=1;i<=iFileSize;i++){
readfile(g_RegistrationFile,FileData,i,MAX_DATA_LENGTH);
/*Wenn Spieler schon registriert ist -> Abbruch*/
if(strstrx(FileData,User)!=-1 && strstrx(FileData,AuthID)!=-1){
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Hallo %s! Du bist bereits in der Liga registriert!",User);
error=1;
break;
/*Wenn ein Spieler existiert, der den selben Spielernamen hat -> Abbruch*/
}else if(strstrx(FileData,User)!=-1){
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Hallo %s! Jemand mit diesem Namen ist bereits registriert!",User);
error=1;
break;
/*Wenn ein Spieler existiert, der die selbe Steam_ID hat -> Abbruch*/
}else if(strstrx(FileData,AuthID)!=-1){
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Hallo %s! Jemand mit der Steam_ID ^"%s^" ist bereits registriert!",User,AuthID);
error=1;
break;
/*Wenn ein Spieler existiert, der die selbe Email_Adresse hat -> Abbruch*/
}else if(strstrx(FileData,Data)!=-1){
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Hallo %s! Jemand hat sich breits mit der Email-Adresse registriert!",User);
error=1;
break;
}
}
}
if(error){
messageex(User,Text,print_chat);
}else{
/*Als Break zwischen User,AuthID und Data nehme ich ALT + NUMPAD 169 = ®*/
snprintf(Text,MAX_TEXT_LENGTH,"%s®%s®%s",User,AuthID,Data);
writefile(g_RegistrationFile,Text,-1);
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] Hallo %s, du wurdest regestriert und",User);
messageex(User,Text,print_chat);
snprintf(Text,MAX_TEXT_LENGTH,"[LIGA-MANAGER] erhaelst in den naechsten Tagen eine Email von mir!");
messageex(User,Text,print_chat);
}
}
P.S.: Der Code ist auf jeden Fall optimierbar. (Wie immer
). Ich würde nach dem strsep im HandleSay direkt die Länge des Keywords auf 0 untersuchen, damit die Schleife nicht durchlaufen wird.