1 //--------------------------------------------------------------------------
2 // CommandEntry.cc - Source file for the CommandEntry
4 // Matthew E. Moses & Michael A. Long
7 // $Date: 1998/09/10 19:57:17 $
12 // $Log: CommandEntry.cc,v $
13 // Revision 1.13 1998/09/10 19:57:17 mlong
14 // lots of little bug fixes and a few new features
16 // Revision 1.12 1998/06/18 18:41:30 mlong
17 // prepairing for yet another move.
19 // Revision 1.11 1998/06/08 20:41:17 mlong
20 // changes to the list tournies function
22 // Revision 1.10 1998/04/29 15:23:19 mlong
23 // prepairing for the move to daimi
24 // new sorting routine.
26 // Revision 1.9 1998/04/18 18:46:04 mlong
28 // added delete tourney function
30 // Revision 1.5 1997/10/08 21:03:35 chess
31 // preparing for move to oracle machine at eworks.
33 // Revision 1.4 1997/05/15 18:27:53 chess
34 // added Player and TourneyPlayers support
35 // added HandleGetPlayerInfo & HandleGetGameInfo
37 // Revision 1.3 1997/04/13 03:14:35 chess
38 // commands to do user statistic manipulationn added:
39 // setinfo - sets a whole line of information
40 // setstat - sets a particular stat
41 // addabuse - adds (or deletes) abuse points.
43 // Revision 1.2 1997/03/21 15:32:36 moses
44 // added the shutdown command.
46 // Revision 1.1 1996/10/01 20:14:43 moses
49 //--------------------------------------------------------------------------
51 // static char RCSid[] = "$Id: CommandEntry.cc,v 1.13 1998/09/10 19:57:17 mlong Exp $";
53 #include "CommandEntry.hh"
58 //- AddAbuse -------------------------------------------------------
59 int CommandEntry::AddAbuse(User *user, param_list params) {
61 char name[MAX_WORD_SIZE];
64 if(params[0].type == TYPE_WORD) {
65 strcpy(name, params[0].val.word);
68 u = gMamer.FindUser(name);
71 u->LoadPlayer(gMamer.userFilePath, name); // Loads the player info into memory and saves current info to disk
75 if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
76 (user->GetManagerLevel() != PRESIDENT)) {
77 if(needToDelete) delete u;
78 gMamer.TellUser(NoPermissions, user->name);
83 if(params[1].type == TYPE_INT) {
84 u->AddAbuse(params[1].val.integer);
88 u->SavePlayer(gMamer.userFilePath);
89 if(u->GetAbuse() >= MAX_CHAOS_POINTS)
90 gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n");
91 gMamer.TellUser(ChangedAbuse, user->name, u->name, u->GetAbuse());
93 gMamer.TellUser(NotFound, user->name, name);
95 if(needToDelete) delete u;
100 //- FingerUser -------------------------------------------------------
101 int CommandEntry::FingerUser(User *user, param_list params) {
106 memset(name, '\0', 32);
107 if(params[0].type == TYPE_WORD) {
108 strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word)));
110 strcpy(name, user->name);
113 u = gMamer.FindUser(name);
114 if(u != NULL) notFound = 0;
118 notFound = u->LoadPlayer(gMamer.userFilePath, name);
119 notFound = !notFound;
122 gMamer.XServerCom("%s %s %s%s%s", "qtell", user->name, "\\n", u->name, "'s Stats:\\n\\n");
123 gMamer.XServerCom("%-17s %5s %4s %4s %3s %3s %3s %3s %5s %6s%-17s %4s %3s %3s %3s %3s %3s %3s %5s %6s",
124 "Name", " Tnys", " W ", " L ", " D ", "1st", "2nd", "3rd", "Chaos", "Rating\\n",
125 "-----------------", "-----", "----", "----", "---", "---", "---", "---", "-----","------\\n");
126 gMamer.XServerCom("%-17s %5ld %4ld %4ld %3ld %3ld %3ld %3ld %5d %6.2f %s",
127 u->name, u->GetPlayedTourneys(), u->GetWins(), u->GetLosses(), u->GetDraws(),
128 u->GetFirsts(), u->GetSeconds(), u->GetThirds(), u->GetAbuse(), u->GetRating(), "\\n");
129 if(u->GetManagerLevel() > USER) {
130 gMamer.XServerCom("%s %d %s %d %s", "\\nManager Level:", u->GetManagerLevel(),
131 " Managed Tourneys:", u->GetManagedTourneys(), "\\n");
133 gMamer.XServerCom("%s", "\n");
135 gMamer.TellUser(NotFound, user->name, name);
137 if(notFound) delete u;
140 } //- End of FingerUser
142 //- ListRank ----------------------------------------------------------
143 int CommandEntry::ListRank(User *user, param_list params) {
145 int start=0, i=0, end=0, tourneys=0, counter=0;
146 char filename[128], name[32], name2[32];
149 memset(name, '\0', 32);
150 memset(name2, '\0', 32);
151 switch (params[0].type) {
153 strcpy(name, params[0].val.word);
156 start = params[0].val.integer;
157 if(start <= 0) {start = 1;}
160 strcpy(name, user->name);
164 sprintf(filename, "%s/rank", gMamer.dataFilePath);
165 if(params[0].type != TYPE_INT) {
166 if((theFile = fopen(filename, "r"))) {
167 while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) {
168 if(!(strncasecmp(name2, name, strlen(name)))) {
176 gMamer.TellUser(NotFound, user->name, filename);
181 gMamer.TellUser(NotFound, user->name, name);
186 if(start <= 0) {start = 1; end = 21;}
187 gMamer.XServerCom("%s %s %s %s%s %-5s %-18s %5s %6s %5s %-18s %5s %6s", "qtell", user->name, "\\n", gMamer.username,
188 "'s Rankings:\\n\\n", "Rank", "Name", "Trnys", "Rating\\n",
189 "-----", "------------------", "-----", "------\n");
190 gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
191 if(!(theFile = fopen(filename, "r"))) { return(0); }
193 while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) {
194 if((i >= start) && (i < end)) {
195 if(i == start) { counter = 1; }
196 gMamer.XServerCom(" %-5d %-18s %5d %6.2f\\n", i, name2, tourneys, rating);
197 if(((counter % 10) == 0) && (counter > 0)) {
198 gMamer.XServerCom("%s", "\n");
200 gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
204 if(i > end) { break; }
209 if(i <= end) { gMamer.XServerCom("%s", "\n"); }
214 //- ListManagers ------------------------------------------------------
215 int CommandEntry::ListManagers(User *user, param_list params) {
216 int i=1, needToDelete=0;
218 char filename[256], manager[NAMELEN], date[16];
219 User *u=NULL, *newUser = NULL;
223 i = params[0].type; // just to get rid of the compiler messages
224 sprintf(filename, "%s/managers", gMamer.dataFilePath);
225 if((theFile = fopen(filename, "r"))) {
226 gMamer.XServerCom("%s %s %s %s%s", "qtell", user->name, "\\n", gMamer.username, "'s Manager List:\\n\\n");
227 gMamer.XServerCom("%2s%-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s",
228 "","Name","Lvl","Tnys","Last", "","Name","Lvl","Tnys","Last", "\\n");
229 gMamer.XServerCom(" %-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s",
230 "-----------------", "---", "----", "--------", "",
231 "-----------------", "---", "----", "--------", "", "\\n");
233 memset(date, '\0', 64);
234 gMamer.XServerCom("\n%s %s ", "qtell", user->name);
235 while(fscanf(theFile, "%s", manager) > 0) {
237 u = gMamer.FindUser(manager);
240 newUser = new User();
243 if(0 != u->LoadPlayer(gMamer.userFilePath, manager)) {
246 tmpDate = localtime(&last);
247 sprintf(date, "%02d/%02d/%02d", tmpDate->tm_mon+1, tmpDate->tm_mday, tmpDate->tm_year);
249 sprintf(date, "none");
252 sprintf(date, "%s", "none");
254 gMamer.XServerCom("%2s%-18s %3d %4d %8s%s",
255 ((gMamer.UserIsLoaded(manager)) ? "+" : " "),
256 manager, u->GetManagerLevel(), u->GetManagedTourneys(), date, (i%2)==0 ? "\\n":"");
257 if(((i % 20) == 0) && (i > 0)) {
259 gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
268 gMamer.XServerCom("%s", "\n");
272 gMamer.TellUser(NotFound, user->name, filename);
276 //- LoadedUsers -------------------------------------------------------
277 int CommandEntry::LoadedUsers(User *user, param_list params) {
279 LinkListIter<User> userIter(gMamer.userList);
285 gMamer.XServerCom("qtell %s \\nLoaded Users:\\n\\n", user->name);
286 while((u = userIter.Next())) {
288 gMamer.XServerCom(" %18s%s", u->name, (i%3)==0 ? "\\n":"");
289 if(((i % 30) == 0) && (i > 0)) {
291 gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
295 gMamer.XServerCom("%sTotal: %i%s", "\\n", count, "\n");
298 } //- End of LoadedUser
300 //- SetCommandLevel ----------------------------------------------------
301 int CommandEntry::SetCommandLevel(User *user, param_list params) {
304 c = gMamer.FindCommand(params[0].val.word, user->name);
307 if((c->GetManagerLevel() <= user->GetManagerLevel()) &&
308 (params[1].val.integer <= user->GetManagerLevel())) {
309 c->SetManagerLevel((ranks)params[1].val.integer);
310 gMamer.TellUser(ChangedCommandLevel, user->name, params[0].val.word, params[1].val.integer);
312 gMamer.TellUser(NoPermissions, user->name);
319 //- SetInfo -------------------------------------------------------
320 int CommandEntry::SetInfo(User *user, param_list params) {
325 memset(name, '\0', 32);
326 if(params[0].type == TYPE_WORD) {
327 strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word)));
330 u = gMamer.FindUser(name);
331 if(u != NULL) notFound = 0;
335 u->LoadPlayer(gMamer.userFilePath, name);
339 if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
340 (user->GetManagerLevel() != PRESIDENT)) {
341 if(notFound) delete u;
342 gMamer.TellUser(NoPermissions, user->name);
346 u->SetStatistic(i, params[i].val.integer);
347 u->SavePlayer(gMamer.userFilePath);
348 gMamer.TellUser(ChangedInfo, user->name, u->name);
350 gMamer.TellUser(NotFound, user->name, name);
352 if(notFound) delete u;
357 //- SetManagerLevel -------------------------------------------------------
358 int CommandEntry::SetManagerLevel(User *user, param_list params) {
360 int notFound=1, new_level=1, length=0, i=0;
363 if(params[0].type == TYPE_WORD) {
364 length = strlen(params[0].val.word);
365 memset(name, '\0', 32);
366 while((i < 31) && (i < length)) {
367 name[i] = tolower(params[0].val.word[i]);
371 new_level = params[1].val.integer;
373 u = gMamer.FindUser(name);
374 if(u != NULL) notFound = 0;
378 u->LoadPlayer(gMamer.userFilePath, name);
380 if(((u->GetManagerLevel() >= user->GetManagerLevel()) ||
381 (new_level >= user->GetManagerLevel())) &&
382 (user->GetManagerLevel() != PRESIDENT)) {
383 if(notFound) delete u;
384 gMamer.TellUser(NoPermissions, user->name);
389 u->ChangeManagerLevel(new_level);
390 u->SavePlayer(gMamer.userFilePath);
391 gMamer.TellUser(ChangedManagerLevel, user->name, u->name, new_level);
393 gMamer.TellUser(NotFound, user->name, name);
395 if(notFound) delete u;
401 } //- End of SetManagerLevel
404 //- SetStat -------------------------------------------------------
405 int CommandEntry::SetStat(User *user, param_list params) {
407 int notFound=1, new_value, i, ret=0, size=0, counter=0;
408 char which_stat[64], name[32];
409 strings statAliases[] = {
410 {"tourneys", 1}, {"tnys", 1},
412 {"losses", 3}, {"lose", 3},
414 {"firsts", 5}, {"1sts", 5},
415 {"seconds", 6}, {"2nds", 6},
416 {"thirds", 7}, {"3rds", 7},
419 {"managedtourneys", 10},
423 memset(which_stat, '\0', 64);
424 if(params[0].type == TYPE_WORD) { strcpy(name, params[0].val.word); }
425 if(params[1].type == TYPE_WORD) { strncpy(which_stat, params[1].val.word, MIN(63, strlen(params[1].val.word))); }
426 size = strlen(which_stat);
427 new_value = params[2].val.integer;
429 u = gMamer.FindUser(name);
430 if(u != NULL) notFound = 0;
434 u->LoadPlayer(gMamer.userFilePath, name);
437 if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
438 (user->GetManagerLevel() != PRESIDENT)) {
439 if(notFound) delete u;
440 gMamer.TellUser(NoPermissions, user->name);
444 while(statAliases[i].string != NULL) {
445 if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) {
447 if(counter > 1) break;
452 gMamer.TellUser(CanNotChange, user->name, u->name, which_stat, new_value);
453 } else if(counter == 0) {
454 gMamer.TellUser(NotFound, user->name, which_stat);
457 while(statAliases[i].string != NULL) {
458 if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) {
459 ret = u->SetStatistic(statAliases[i].number, new_value);
460 memset(which_stat, '\0', 64);
461 strcpy(which_stat, statAliases[i].string);
466 u->SavePlayer(gMamer.userFilePath);
468 gMamer.TellUser(ChangedInfo, user->name, u->name, which_stat, new_value);
470 gMamer.TellUser(NotFound, user->name, which_stat);
473 gMamer.TellUser(NotFound, user->name, name);
475 if(notFound) delete u;
480 //- ShowCommands --------------------------------------------
481 int CommandEntry::ShowCommands(User *user, param_list params) {
483 LinkListIter<Command> commIter(gMamer.commandList);
487 if(params[0].type == TYPE_WORD) {
488 command = params[0].val.word;
489 while((c = commIter.Next())) if(1 == c->IsCommand(command)) break;
491 gMamer.TellUser(NotFound, user->name, command);
494 gMamer.XServerCom("qtell %s %s Notes: %-16s | %-5s | %3d | %s \n",
495 user->name, gMamer.username, c->GetCommandName(),
496 c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription());
499 gMamer.XServerCom("qtell %s %s's Command List:\\n\\n", user->name, gMamer.username);
501 while((c = commIter.Next())) {
502 gMamer.XServerCom(" %-16s | %-5s | %3d | %s\\n",
503 c->GetCommandName(), c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription());
504 if((!(i % 9)) && (i > 0)) {
506 gMamer.XServerCom("%s", "\n");
507 gMamer.XServerCom("qtell %s \\n", user->name);
511 gMamer.XServerCom("%s", "\n");
515 //- ShowHelp -----------------------------------------------
516 int CommandEntry::ShowHelp(User *user, param_list params) {
518 char tmpBuffer[1024], request[128], filename[256];
521 memset(request, '\0', 128);
522 if(params[0].type == TYPE_WORD) {
523 strcpy(request, params[0].val.word);
525 strcpy(request, "index");
527 sprintf(filename, "%s/%s", gMamer.helpFilePath, request);
528 if((theFile = fopen(filename, "r"))) {
529 gMamer.XServerCom("qtell %s \\nThe %s Help File:\\n\\n", user->name, request);
531 memset(filename, '\0', 256);
532 while(fgets(filename, 79, theFile)) { /* Just reusing the variable filename could be any char [] */
533 memset(tmpBuffer, '\0', 1024);
534 strcpy(tmpBuffer, gMamer.s_and_r(filename, "\n", "\\n"));
535 gMamer.XServerCom("%s", tmpBuffer);
536 if(((i % 10) == 0) && (i > 0)) {
538 gMamer.XServerCom("\nqtell %s \\n", user->name);
541 memset(filename, '\0', 256);
544 gMamer.XServerCom("\n");
548 gMamer.TellUser(NotFound, user->name, request);
552 //- CreateTourney ------------------------------------------------------------
553 int CommandEntry::CreateTourney(User *user, param_list params) {
555 int num = gMamer.GenerateTourneyNumber();
557 params[0].type = params[0].type; // Just to stop the annoying unused variable messages during compile.
558 t = new Tourney(num, user, &(gMamer.tourneyParams));
559 gMamer.tourneyList.Append(t);
560 gMamer.XServerCom("%s %s %s %d %s", "xtell", user->name, "Created tourney number: ", t->number, "\n");
562 }//- End CreateTourney
564 //- OpenTourney ------------------------------------------------------------
565 int CommandEntry::OpenTourney(User *user, param_list params) {
566 Tourney *tourn = NULL;
568 tourn = gMamer.FindTourney(params[0].val.integer);
575 gMamer.TellUser(NotFound, user->name, "tourney");
579 //- AnnounceTourney ----------------------------------------------------------
580 int CommandEntry::AnnounceTourney(User *user, param_list params) {
581 Tourney *tourn = NULL;
583 tourn = gMamer.FindTourney(params[0].val.integer);
585 if(tourn->GetStatus() == OPEN) {
589 gMamer.TellUser(TourneyNotOpen, user->name, params[0].val.integer);
593 gMamer.TellUser(NotFound, user->name, "tourney");
596 }//- AnnounceTourney ---------------------------------------------------------
598 //- KeepTourney ------------------------------------------------------------
599 int CommandEntry::KeepTourney(User *user, param_list params) {
602 t = gMamer.FindTourney(params[0].val.integer);
604 if(params[1].type != TYPE_NULL)
605 if(params[1].type == TYPE_WORD) {
606 if(strncasecmp("y", params[1].val.word, 1) == 0) {
608 gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer);
611 gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer);
613 } else if(params[1].type == TYPE_INT) {
614 t->SetPersist(params[1].val.integer);
615 if(params[1].val.integer)
616 gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer);
618 gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer);
620 gMamer.TellUser(NotFound, user->name, "tourney");
626 gMamer.TellUser(NotFound, user->name, "tourney");
630 //- DeleteTourney ------------------------------------------------------------
631 int CommandEntry::DeleteTourney(User *user, param_list params) {
633 TourneyPlayers *tp = NULL;
635 t = gMamer.FindTourney(params[0].val.integer);
637 if(t->GetStatus() != DONE) {
638 LinkListIter<TourneyPlayers> playerIter(t->playerList);
640 while((tp = playerIter.Next())) {
641 gMamer.XServerCom("%s %s %d%s", "tournset", tp->name, 0, "\n");
642 gMamer.XServerCom("tell %s Tourney#%d has been deleted.%s", tp->name, t->number, "\n");
644 gMamer.XServerCom("%s %d %s%d %s", "tell", gMamer.channelNumber,
645 "Tourney #", params[0].val.integer, "has been deleted.\n");
647 gMamer.tourneyList.Delete(t); // delete the tourney
651 gMamer.TellUser(NotFound, user->name, "tourney");
653 }//- End DeleteTourney
655 //- CloseTourney ------------------------------------------------------------
656 int CommandEntry::CloseTourney(User *user, param_list params) {
657 Tourney *tourn = NULL;
659 tourn = gMamer.FindTourney(params[0].val.integer);
661 if(tourn->GetPlayerCount() >= MINIMUM_PLAYERS) {
662 if(tourn->GetStatus() == OPEN) {
663 tourn->CloseAndStart();
664 gMamer.XServerCom("qtell %s %s Notes: %s %d %s",
665 user->name,gMamer.username,"Tourney #",
666 tourn->number, " is now closed.\n");
669 gMamer.TellUser(TourneyNotOpen, user->name, tourn->number);
672 gMamer.TellUser(NotEnoughPlayers, user->name, tourn->number);
675 gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
679 }//- End CloseTourney
681 int CommandEntry::ListTourneys(User *user, param_list params) {
683 LinkListIter<Tourney> tournIter(gMamer.tourneyList);
684 int notourneys = 1, Tstatus=0, i=3;
685 long stDate, enDate, timeNow;
686 struct tm *start, *end;
687 char outStart[128], outEnd[128], outStatus[128];
689 params[0].type = params[0].type; // Just to stop the annoying unused var messages in compile.
690 while((t = tournIter.Next())) notourneys = 0;
692 if(notourneys == 0) {
693 gMamer.XServerCom("qtell %s %s Notes: \\n", user->name, gMamer.username);
694 gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n",
695 "No.","Rds","Sty", "Time", "Inc", "Md", "Vrnt", "Rtng Rnge", "Status"," Started at ", " Ended at ");
696 gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n",
697 "---","---","---", "----", "---", "--", "----", "---------", "------","--------------", "--------------");
699 while((t = tournIter.Next())) {
700 stDate = t->GetStartDate();
701 enDate = t->GetEndDate();
702 Tstatus = t->GetStatus();
703 if((Tstatus == DONE) && (t->GetPersist() == 0)){
705 if((timeNow - enDate) > KEEP_TOURNEY_TIME) {
706 gMamer.tourneyList.Delete(t);
711 start = localtime(&stDate);
712 sprintf(outStart, "%02d:%02d %02d/%02d/%02d",
713 start->tm_hour, start->tm_min, start->tm_mon+1, start->tm_mday, start->tm_year);
714 } else { strcpy(outStart, "n/a"); }
716 end = localtime(&enDate);
717 sprintf(outEnd, "%02d:%02d %02d/%02d/%02d",
718 end->tm_hour, end->tm_min, end->tm_mon+1, end->tm_mday, end->tm_year);
719 } else { strcpy(outEnd, "n/a"); }
721 sprintf(outStatus, "%s", "new");
722 else if(Tstatus == OPEN)
723 sprintf(outStatus, "%s", "open");
724 else if(Tstatus == CLOSED)
725 sprintf(outStatus, "%s", "closed");
726 else if(Tstatus == DONE)
727 sprintf(outStatus, "%s", "done");
729 memset(outStatus, '\0', 128);
731 gMamer.XServerCom(" %3d %3d %3c %4d %3d %2c %4c %4d-%4d %6s %-14s %-14s\\n",
732 t->number, t->params.rounds, t->params.style, t->params.time, t->params.inc,
733 t->params.mode, t->params.variant, t->params.ratingLow, t->params.ratingHigh,
734 outStatus, outStart, outEnd);
735 if(((i % 12) == 0) && (i > 0)) {
737 gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
741 gMamer.XServerCom("%s", "\n");
743 gMamer.XServerCom("qtell %s %s Notes: %s", user->name, gMamer.username, "No tourneys right now.\n");
749 //- JoinTourney ------------------------------------------------------------
750 int CommandEntry::JoinTourney(User *user, param_list params) {
751 Tourney *tourn = NULL;
752 Player *newEntry = NULL;
754 tourn = gMamer.FindTourney(params[0].val.integer);
757 newEntry = new Player(user->name, params[0].val.integer);
758 printf("entry=%d\n",newEntry);
759 gMamer.pendingList.Append(newEntry);
760 gMamer.XServerCom("getpi %s%s", user->name, "\n");
764 gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
768 //- AddToTourney ------------------------------------------------------------
769 int CommandEntry::AddToTourney(User *user, param_list params) {
770 Tourney *tourn = NULL;
771 Player *newEntry = NULL;
773 tourn = gMamer.FindTourney(params[1].val.integer);
776 newEntry = new Player(params[0].val.word, params[1].val.integer);
777 gMamer.pendingList.Append(newEntry);
778 gMamer.XServerCom("getpi %s%s", params[0].val.word, "\n");
782 gMamer.TellUser(TourneyNotFound, user->name, params[1].val.integer);
786 //- RemoveFromTourney ------------------------------------------------------------
787 int CommandEntry::RemoveFromTourney(User *user, param_list params) {
788 Tourney *tourn = NULL;
789 TourneyPlayers *tp=NULL;
790 char name[NAMELEN], reason[64];
793 int chaosPointsEarned=0, needToDelete=0;
795 memset(name, '\0', NAMELEN);
796 memset(reason, '\0', 64);
797 if(params[0].type == TYPE_INT) { // if we are withdrawing ourselves
798 tourn = gMamer.FindTourney(params[0].val.integer);
799 strcpy(name, user->name);
801 num = params[0].val.integer;
802 strcpy(reason, "withdrew");
803 } else { // if a manager is forfeiting us
804 tourn = gMamer.FindTourney(params[1].val.integer);
805 strcpy(name, params[0].val.word);
806 u = gMamer.FindUser(params[0].val.word);
807 num = params[1].val.integer;
808 strcpy(reason, "was forfeited");
812 gMamer.TellUser(TourneyNotFound, user->name, num);
815 if(tourn->GetStatus() == DONE) {
816 gMamer.TellUser(TourneyDone, user->name, num);
819 tp = tourn->GetPlayer(name); //Get the players info
821 gMamer.TellUser(NotFound, user->name, name, num);// Player is not found in this tourney
825 gMamer.XServerCom("%s %s %d%s", "tournset", name, 0, "\n");
826 if(tourn->IsNotClosed()) { //If we get past this check it will cost the user chaos points
827 tourn->playerList.Delete(tp);
828 tourn->CalculateAverage();
829 gMamer.TellUser(PlayerRemoved, user->name, name, num);
830 gMamer.XServerCom("%s %d %s %s %s%d %d%s\n","tell", gMamer.channelNumber, name, reason, "from tourney #",
831 tourn->number, tourn->GetPlayerCount(), " player(s) now");
833 } // otherwise tourney is closed and started
835 chaosPointsEarned = tourn->RemovePlayer(name); // RemovePlayer will return the number of rounds
836 if(chaosPointsEarned >= 0) { // that were disturbed
838 u = new User(gMamer.userFilePath, name); // Make a new user - this will create a file but there
839 needToDelete = 1; // should already be one cause they are in the tourney
841 u->AddAbuse(chaosPointsEarned * PENALTY_PER_ROUND); // add the choas points and save them
842 u->SavePlayer(gMamer.userFilePath);
843 if(u->GetAbuse() >= MAX_CHAOS_POINTS)
844 gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n");
845 if(needToDelete) delete(u); // we created a new user so we should delete him here
846 gMamer.TellUser(PlayerRemoved, user->name, name, num);
847 gMamer.XServerCom("%s %d %s %s %s%d\n","tell",gMamer.channelNumber,name, reason,
848 "from tourney #", tourn->number);
854 //- ListTourneyGames ------------------------------------------------------------
855 int CommandEntry::ListTourneyGames(User *user, param_list params) {
857 TourneyPlayers *white, *black;
861 t = gMamer.FindTourney(params[0].val.integer);
863 LinkListIter<Game> gameIter(t->gameList);
865 gMamer.XServerCom("%s %s %s %d %s", "qtell", user->name, "Tourney Games for Round #", t->GetRound(), "\\n\\n");
866 gMamer.XServerCom("%3s %18s %6s %6s %2s %-18s %6s %6s %s",
867 "", "White", "[SCR ]", "[Rtng]", "vs", "Black", "[SCR ]", "[Rtng]",
868 "\\n---------------------------------------------------------------------------\\n");
869 while((g = gameIter.Next())) {
870 if(!(i % 10) && (i>0)) {
871 gMamer.XServerCom("\nqtell %s %s", user->name, "\\n");
874 white = t->GetPlayer(g->whiteName);
875 black = t->GetPlayer(g->blackName);
877 if(g->gameNumber > 0) {
878 gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] %3i%s",
879 i+1, g->whiteName, white->score, white->rating,
880 g->blackName, black->score, black->rating, g->gameNumber, "\\n");
882 gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] none%s",
883 i+1, g->whiteName, white->score, white->rating,
884 g->blackName, black->score, black->rating, "\\n");
888 gMamer.XServerCom("%s", "\\n\n");
892 gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
894 }//- End of ListTourneyGames
896 //- ListTourneyPlayers ------------------------------------------------------------
897 int CommandEntry::ListTourneyPlayers(User *user, param_list params) {
899 Player *p = NULL, *opp=NULL;
900 TourneyPlayers *tp = NULL;
902 int i = 0, counter = 0;
904 t = gMamer.FindTourney(params[0].val.integer);
906 if(t->GetPlayerCount() == 0) {
907 gMamer.TellUser(NoPlayers, user->name, params[0].val.integer);
911 gMamer.XServerCom("%s %s %s %s %d %s %d %s %3s %-17s %6s %5s %6s %-6s %-7s %s %3s %-17s %6s %5s %6s %6s %-7s %s",
912 "qtell", user->name, "Tourney Players:", "Round", t->GetRound(), "of", t->params.rounds,
913 "\\n\\n", "", "Name", "Rating", "Score", "Perfrm", "Upset ", "Results", "\\n",
914 "", "-----------------", "------", "-----", "------", "------", "-------", "\\n");
915 LinkListIter<TourneyPlayers> playerIter(t->playerList);
917 while((tp = playerIter.Next())) { counter++; } // count the number of players
918 for(i=1; i<=counter; i++) {
919 p = t->GetSortPlayer(i);
920 tp = t->GetPlayer(p->name);
921 if(tp->activeFlag > 0)
922 gMamer.XServerCom("%3d %s%-17s [%4d] %3.1f [%4d] [%4d] ",
923 i, ((tp->location == ONLINE) ? "+" : "-"),
924 tp->name, tp->rating, tp->score, tp->perform, tp->upset);
926 gMamer.XServerCom("%3d %s%-17s [%4s] %3.1f [%4d] [%4d] ",
927 i, ((tp->location == ONLINE) ? "+" : "-"),
928 tp->name, "forf", tp->score, tp->perform, tp->upset);
929 LinkListIter<Player> opponentIter(tp->opponentList); // List of opponents this player has had
930 opponentIter.Reset();
931 while((opp = opponentIter.Next())) {
932 p = t->GetSortPlayer(opp->name);
933 if(opp->value) { color = 'w'; } else { color = 'b'; }
934 if(opp->floatValue == 1.0) {
936 } else if(opp->floatValue == 0.5) {
938 } else if(opp->floatValue == 0.0) {
943 gMamer.XServerCom("%c%-0.2d%c ", result, p->value, color);
945 if(((i % 9) == 0) && (i > 0)) {
946 gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
948 gMamer.XServerCom("%s", "\\n");
951 gMamer.XServerCom("%-24s %6.1f %s", "\\n Average Rating", t->GetAverageRating(), "\\n\n");
955 gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
957 }//- End of ListTourneyPlayers
959 //- ListTourneyVars -----------------------------------------------------
960 int CommandEntry::ListTourneyVars(User *user, param_list params) {
961 Tourney *tourn = NULL;
963 tourn = gMamer.FindTourney(params[0].val.integer);
966 gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
967 gMamer.XServerCom(" %18s %4d %s", "(T)ime: ", tourn->params.time, "\\n");
968 gMamer.XServerCom(" %18s %4d %s", "(I)ncrement: ", tourn->params.inc, "\\n");
969 gMamer.XServerCom(" %18s %4d %s", "(R)ounds: ", tourn->params.rounds, "\\n");
970 gMamer.XServerCom(" %18s %4d %s", "Max (P)layers: ", tourn->params.maxPlayers, "\\n");
971 gMamer.XServerCom(" %18s %4c %s", "(M)ode: ", tourn->params.mode, "(r)ated or (u)nrated\\n");
972 gMamer.XServerCom(" %18s %4c %s", "(S)tyle: ", tourn->params.style, "(s)wiss or (r)oundrobin\\n");
973 gMamer.XServerCom(" %18s %4c %s","(V)ariant: ",tourn->params.variant, "(w)ild, (r)egular, (b)ug, or (s)uicide\\n");
974 if(tourn->params.variant == 'w')
975 gMamer.XServerCom(" %18s %4d %s",
977 tourn->params.wild, "(0), (1), (2), (3), (4), (5), (8), (9)8a, (10)fr\\n");
978 gMamer.XServerCom(" %18s %4d %s", "Rating (L)ow: ", tourn->params.ratingLow, "\\n");
979 gMamer.XServerCom(" %18s %4d %s", "Rating (H)igh: ", tourn->params.ratingHigh, "\\n\\n");
980 gMamer.XServerCom(" %18s %-18s %s", "Manager: ", tourn->manager, "\\n\n");
982 gMamer.TellUser(NotFound, user->name, "tourney");
986 }//- End ListTourneyVars
988 //- MessageManagers -----------------------------------------------------
989 int CommandEntry::MessageManagers(User *user, param_list params) {
990 int i, level, tourneys;
992 char filename[256], manager[NAMELEN];
996 level = params[0].type;
997 sprintf(filename, "%s/managers", gMamer.dataFilePath);
998 if((theFile = fopen(filename, "r"))) {
999 while(fscanf(theFile, "%s %d %d %ld", manager, &level, &tourneys, &last) > 0) {
1000 gMamer.XServerCom("%s %s %s %s", "message", manager, params[0].val.string, "\n");
1006 gMamer.TellUser(NotFound, user->name, "Manager List");
1008 }//- MessageManagers
1010 //- SetResult ------------------------------------------------------------
1011 int CommandEntry::SetResult(User *user, param_list params) {
1013 int result, return_val = 0;
1016 t = gMamer.FindTourney(params[0].val.integer);
1019 switch (params[3].type) { // try and set the result
1021 switch(params[3].val.integer) {
1022 case 1: result = 1; break;
1023 case 0: result = 0; break;
1028 if(!strcmp("=", params[3].val.word)) { result = 2;
1029 } else if(!strcmp("draw", params[3].val.word)) { result = 2;
1030 } else if(!strcmp("win", params[3].val.word)) { result = 1;
1031 } else if(!strcmp("white", params[3].val.word)) { result = 1;
1032 } else if(!strcmp("loss", params[3].val.word)) { result = 0;
1033 } else if(!strcmp("black", params[3].val.word)) { result = 0;
1035 gMamer.TellUser(GameResultNotFound, user->name, params[3].val.word);
1040 gMamer.TellUser(GameResultNotFound, user->name, params[3].val.string);
1044 return_val = t->SetGameResult(params[1].val.word, params[2].val.word, result);
1046 switch (return_val) {
1048 sprintf(answer, "a game with %s as white and %s as black", params[1].val.word, params[2].val.word);
1049 gMamer.TellUser(NotFound, user->name, answer);
1052 gMamer.TellUser(GameResultSet, user->name, params[1].val.word, params[2].val.word, result);
1055 sprintf(answer, "1-0");
1058 sprintf(answer, "0-1");
1061 sprintf(answer, "1/2-1/2");
1064 gMamer.XServerCom("%s %d The game %s vs. %s in tourney #%d has been set %s by %s\n", "tell", gMamer.channelNumber,
1065 params[1].val.word, params[2].val.word, t->number, answer, user->name);
1069 }//- End of SetResult
1071 //- SetTourneyVariable -----------------------------------------------------
1072 int CommandEntry::SetTourneyVariable(User *user, param_list params) {
1073 Tourney *tourn = NULL;
1076 strings varAliases[] = {
1077 {"time", 0}, {"t", 0}, {"inc", 1}, {"i", 1}, {"rounds", 2}, {"r", 2},
1078 {"style", 3}, {"s", 3}, {"variant", 4}, {"v", 4}, {"mode", 5}, {"m", 5},
1079 {"wild", 6}, {"w", 6},
1080 {"ratingLow", 7}, {"l", 7}, {"ratingHigh", 8}, {"h", 8}, {"maxplayers", 9}, {"p", 9}, {NULL} };
1082 tourn = gMamer.FindTourney(params[0].val.integer); // what tourney are we talking about
1084 gMamer.TellUser(NotFound, user->name, "tourney"); // wrong tourney number
1087 if(FALSE == tourn->IsNotClosed()) {
1088 gMamer.TellUser(TourneyClosed, user->name, params[0].val.integer);
1091 if(TRUE == tourn->IsNotNew()) {
1092 if((0 != strncasecmp(params[1].val.word, "rounds", strlen(params[1].val.word))) && // even if it is open
1093 (0 != strncasecmp(params[1].val.word, "r", strlen(params[1].val.word))) && // we can still change rounds
1094 (0 != strncasecmp(params[1].val.word, "maxplayers", strlen(params[1].val.word))) && // or max players
1095 (0 != strncasecmp(params[1].val.word, "p", strlen(params[1].val.word))) && //
1096 (0 != strncasecmp(params[1].val.word, "style", strlen(params[1].val.word))) && // or style (rr) to (ss)
1097 (0 != strncasecmp(params[1].val.word, "s", strlen(params[1].val.word)))) {
1098 gMamer.TellUser(TourneyNotNew, user->name, params[0].val.integer);
1102 if(strcasecmp(user->name, tourn->manager) != 0) {
1103 gMamer.TellUser(NoPermissions, user->name, params[0].val.integer);
1106 while(varAliases[i].string != NULL) {
1107 if (!(strcasecmp(varAliases[i].string, params[1].val.word))) { //lets check the vars
1108 if(strlen(varAliases[i].string) == 1)
1109 strcpy(which_var, varAliases[i-1].string);
1110 else //copy the whole word
1111 strcpy(which_var, varAliases[i].string);
1113 if((varAliases[i].number <= 2) || (varAliases[i].number >= 6))
1114 if(params[2].type == TYPE_INT) { // if var is one that should be int
1115 tourn->SetVariable(varAliases[i].number, params[2].val.integer);
1116 gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.integer);
1119 gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.word);
1123 if(params[2].type == TYPE_WORD) {
1124 tourn->SetVariable(varAliases[i].number, params[2].val.word);
1125 gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.word);
1128 gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.integer);
1135 gMamer.TellUser(NotFound, user->name, params[1].val.word); // Bad Variable
1139 //- ShutdownCommand ----------------------------------------------------------
1140 int CommandEntry::Shutdown(User *user, param_list params) {
1144 i = user->GetManagerLevel();
1150 } //- end of Shutdown