From 0cfd340972f2533dc835374a38dba2b1428b20e2 Mon Sep 17 00:00:00 2001 From: Ralf Ertzinger Date: Fri, 10 Jan 2014 22:40:56 +0100 Subject: [PATCH 1/1] Initial checkin --- COPYING | 340 +++++++++++++++++++++++++++++ README | 109 ++++++++++ gs_analyze/README | 36 ++++ gs_analyze/gs_analyze2.pl | 327 ++++++++++++++++++++++++++++ gs_analyze/mapnames.txt | 11 + server/README | 4 + server/jff.template | 98 +++++++++ server/mapnames.txt | 11 + server/ndc.template | 166 ++++++++++++++ server/ndcstrict.template | 163 ++++++++++++++ server/quakec5.pl | 444 ++++++++++++++++++++++++++++++++++++++ stats/README | 66 ++++++ stats/dailystats.pl | 278 ++++++++++++++++++++++++ stats/dailystats_wap3.pl | 138 ++++++++++++ stats/databasectrl.sh | 2 + stats/foreverstats2.pl | 290 +++++++++++++++++++++++++ stats/foreverstats3.pl | 240 +++++++++++++++++++++ stats/foreverstats_wap.pl | 160 ++++++++++++++ stats/foreverstatsstrict.template | 90 ++++++++ stats/makedb.pl | 171 +++++++++++++++ stats/makerank.pl | 59 +++++ stats/playerstats.pl | 299 +++++++++++++++++++++++++ stats/stats.sql | 29 +++ 23 files changed, 3531 insertions(+) create mode 100644 COPYING create mode 100644 README create mode 100644 gs_analyze/README create mode 100755 gs_analyze/gs_analyze2.pl create mode 100644 gs_analyze/mapnames.txt create mode 100644 server/README create mode 100644 server/jff.template create mode 100644 server/mapnames.txt create mode 100644 server/ndc.template create mode 100644 server/ndcstrict.template create mode 100644 server/quakec5.pl create mode 100644 stats/README create mode 100644 stats/dailystats.pl create mode 100644 stats/dailystats_wap3.pl create mode 100644 stats/databasectrl.sh create mode 100644 stats/foreverstats2.pl create mode 100644 stats/foreverstats3.pl create mode 100644 stats/foreverstats_wap.pl create mode 100644 stats/foreverstatsstrict.template create mode 100644 stats/makedb.pl create mode 100644 stats/makerank.pl create mode 100644 stats/playerstats.pl create mode 100644 stats/stats.sql diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..60549be --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/README b/README new file mode 100644 index 0000000..f9c5fe3 --- /dev/null +++ b/README @@ -0,0 +1,109 @@ +README - NDC Code +================= + +Dies ist die README fuer die GPL-Release des NDC (Northcore Deathmatch +Clan) Codes fuer Quakeserver-Administration und -Auswertung (oder +ganz kurz: NDC Code). + +Die in diesem Paket gesammelten Werke sind ueber die Jahre aus +eigenem Beduerfnis bei der Verwaltung unserer Quakeserver und +der Homepage entstanden. +Meisterwerke sind nach unserer Meinung nicht dabei, aber da es +genug Leute gegeben hat, die Interesse an dem Code gezeigt +haben: nun, hier ist er. +Erwartet bitte keinen wunderschoenen und akurat durchkommentierten +Code. Ich habe versucht, die groessten Knaller rauszufeilen +(ich habe Perl und SQL gelernt, waehrend dieser Code entstand, +und das sieht man), aber teilweise sind da noch Stellen +drin, die ich selber nicht mehr verstehe. +Der gesamte Code steht von der ersten bis zur letzten Zeile +unter der GPL (GNU Public License), in voller Laenge und +Schoenheit nachzulesen in der Datei COPYING. + +Was heisst das fuer Euch und uns? +(Note: Dieser Absatz ist meine Interpretation der GPL. Er ist +_keine_ Rechtsgrundlage. Gueltig ist der Wortlaut der GPL, +zu entnehmen der Datei COPYING, oder bei der FSF) +Fuer uns heisst es: was auch immer dieser Code bei Euch anrichten +mag, es ist einzig und allein Euer Problem. Wir uebernehmen keinerlei +Garantie fuer die Funktionalitaet, Sicherheit oder Brauchbarkeit +des Codes fuer irgendwelche Zwecke. +Fuer Euch heisst es: Macht damit, was ihr wollt. Veraendert ihn, +erweitert ihn, benutzt, was Euch gefaellt, und werft den Rest weg. +Dies alles unter einer Bedingung: der Code, der aus unserem oder +mit Hilfe unseres Codes entsteht, muss wieder unter der GPL stehen. +Man koennte sagen, GPL ist ansteckend. Und Heilmittel gibts keins :) +Dass abgeleiteter Code wieder unter der GPL steht, impliziert +automatisch, daß er wieder frei verfügbar sein muss. Das heisst +_nicht_, dass ihr damit kein Geld verdienen duerft. Ihr duerft +Programme verfassen, und dafuer Geld verlangen. Aber ihr muesst +(spaetestens auf Anfrage) den Code rausruecken. + + +INHALT +====== + +Was verbirgt sich nun in den einzelnen Verzeichnissen? Eine kurze +Auflistung: + +gs_analyze Ein Perl-Script, dass die von Lithium (und anderen + MODs) erzeugten GS-Logfiles auswertet, und in eine + Form bringt, die die Datenbankscripte leichter ver- + arbeiten koennen. + Das Script erzeugt eine Gesamtstatistik, und + Statistiken fuer einzelne Maps. + +stats Die Teile des Codes, die auf der Website im Vordergrund + (dailystats, foreverstats, playerstats) und im Hintergrund + (makedb, makerank) die Statistiken verwalten. + +server Das quakec5-Skript, das den Echtzeit-Status eines + Quake2-Servers auswertet. + + +VORAUSSETZUNGEN +=============== + +Was braucht man fuer all das hier? Von den technischen Voraussetzungen +her: +perl (mindestens 5.002) +MySQL 3.22 +apache 1.3 + +Es gibt keinen wirklichen Grund, warum das alles hier nicht auch mit +IIS und Oracle laufen sollte, aber die obige Liste stellt die laufende +Konfiguration dar, und ist als solche geprueft. + +Noch etwas: die Skripte sind zwar "aus dem Leben" gegriffen, aber +natuerlich steht da auch etwas drin, was Euch nix angeht. Passworte, +Serverpfade, so ein Zeug. Das ist in diesem Release entfernt. +Das bringt es mit sich, dass moeglicherweise (oder eher: ziemlich +sicher) dieser Sourcetree nicht aus der Tuete laufen wird. Wer also +Angst vor dreckigen Fingern und anderer Leute Code hat, ist hiermit +wohl auf dem falschen Dampfer. Aber solche Personen lesen fuer gewoehnlich +auch keine READMEs :) + + +VERSIONIERUNG +============= + +Versionsnummern? Was ist das? +Bei den fuer NDC erstellten Scripts war das nie ein grosses Thema. +Neuere Versionen wurden einfach gnadenlos in den alten Code +reingeschoben. Bei guter Laune des Autors wurde dem Dateinamen +eine sich (eventuell sogar nachvollziehbar erhoehende) angehaengte +Nummer verpasst. Diese Nummern haben sie hier auch. +Aus diesem Chaos heraus deklarieren wir alle hier mitgelieferten +Programme als Version NDC Code Release 1. Also bitte nicht wundern, +wenn es eine foreverstats3.pl gibt, aber keine Spur der vorigen +zu finden ist. Das ist dann eben so :) + + +KONTAKT +======= + +Bei Fragen, Anregungen, Bugfixes: +http://www.ndc.sh/ndccode + +oder +ndccode@ndc.sh diff --git a/gs_analyze/README b/gs_analyze/README new file mode 100644 index 0000000..2ca4212 --- /dev/null +++ b/gs_analyze/README @@ -0,0 +1,36 @@ +README - gs_analyze2.pl +======================= + +Eines der Kernstuecke des Statistiksystems. Dieses Script +laeuft bevorzugt auf dem Quake-Server selbst, wo es +Logfiles im GS-Format liest, und in ein kuerzeres Logfile +umwandelt, das von den Datenbankscripten weiterverarbeitet +werden kann. + +Das Script liest seine Daten von STDIN. Die Ausgabe erfolgt +zu einen in eine Datei (big.res), die die gesamte Statistik +fuer das Logfile enthaelt. +Zum anderen liest das Script, falls vorhanden, eine Datei namens +mapnames.txt ein. Da GS-Logfiles aus nicht bekannten Gruenden +nicht den BSP-Namen der gespielten Maps, sondern den vollen Namen +(also nicht q2dm1 sondern "The Edge") enthalten, wird der Inhalt +dieser Datei zur Uebersetzung genutzt. +Fuer Maps, deren BSP-Namen das Script auf diese Weise ermitteln +kann, werden separate Logdateien mit dem Namen des BSP (also +q2dm1.res...) geschrieben. + +Jede .res-Datei enthaelt in einer Zeile Daten fuer je einen +Spieler. Die einzelnen Felder sind durch ":" getrennt (nein, +wir machen uns keine Gedanken um : in Spielernamen). Die einzelnen +Felder: + +Name +Kills +Victims +Suicides +gespielte Maps +gewonnene Maps +Spielzeit (Sekunden) + +Die jeweils erste Zeile (ohne Spielernamen, beginnend mit einem :) +enthaelt die jeweiligen Summen aller Felder. diff --git a/gs_analyze/gs_analyze2.pl b/gs_analyze/gs_analyze2.pl new file mode 100755 index 0000000..69e61fe --- /dev/null +++ b/gs_analyze/gs_analyze2.pl @@ -0,0 +1,327 @@ +#!/usr/bin/perl -w + +# gs_analyze2.pl +# NDC Code Release 1 +# +# Reads a GS-compliant log file from STDIN, writes processed logs +# to various files. +# +# Copyright (C) 2001 Andreas Ulbrich, Ralf Ertzinger (ndccode@ndc.sh) +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +@gslog=; + +# Enable this line for debugging + +# $debug = 1; + +# Read mapname-mapping from file + +open (MAPNAMES,"mapnames.txt") or die "Could not open mapnames.txt: $!\n"; + +# Log file for skill calculation +open (SKILLOG, ">skill.log") or die "Could not open skill.log: $!\n"; + +while ($line=) { + + ($handle,$mapname) = split (":",$line); + chop($mapname); + $handle{$mapname} = $handle; +} + +close (MAPNAMES); + +while ($gslog_line = shift(@gslog)) { + + ($killer,$victim,$action,$weapon,$fragdiff,$timestamp,$ping) = + split("\t",$gslog_line); + + unless (defined($action)) { + next; + } + + if ($action eq "Kill") { + $pl_kills{"##global"}{$killer}++; + $pl_kills{$actual_map}{$killer}++; + $pl_victims{"##global"}{$victim}++; + $pl_victims{$actual_map}{$victim}++; + if (defined($pl_count_map{$killer})) { + $pl_maps_played{"##global"}{$killer}++; + $pl_maps_played{$actual_map}{$killer}++; + print "Map count for $killer increased to $pl_maps_played{\"##global\"}{$killer}\n" if $debug; + undef $pl_count_map{$killer}; + } + if (defined($pl_count_map{$victim})) { + $pl_maps_played{"##global"}{$victim}++; + $pl_maps_played{$actual_map}{$victim}++; + print "Map count for $victim increased to $pl_maps_played{\"##global\"}{$victim}\n" if $debug; + undef $pl_count_map{$victim}; + } + $sys_kills{"##global"}++; + $sys_kills{$actual_map}++; + $pl_kills_local{$killer}++; + + # Print out skill log + print SKILLOG "K:$killer:$victim\n"; + } + + if ($action eq "Suicide") { + $pl_suicides{"##global"}{$killer}++; + $pl_suicides{$actual_map}{$killer}++; + if (defined($pl_count_map{$killer})) { + $pl_maps_played{"##global"}{$killer}++; + $pl_maps_played{$actual_map}{$killer}++; + print "Map count for $killer increased to $pl_maps_played{\"##global\"}{$killer}\n" if $debug; + undef $pl_count_map{$killer}; + } + $sys_suicides{"##global"}++; + $sys_suicides{$actual_map}++; + $pl_kills_local{$killer}--; + + # Print out skill log + print SKILLOG "S:$killer\n"; + } + + # Check if a new map has been started. + # $weapon holds the map name + + if ($action eq "Map") { + chop ($weapon); + chop ($weapon); + $actual_map = $handle{$weapon}; + unless (defined($actual_map)) { + $actual_map = "##undefined"; + } + $sys_maps_played{"##global"}++; + $sys_maps_played{$actual_map}++; + print "Map started: $actual_map\n" if $debug; + } + + # Check for a newly started game. + + if ($action eq "GameStart") { + pl_disconnect_all(); + } + + + # Check for the end of a map. Calculate map winner. + # Log out all players + + if ($action eq "GameEnd") { + print "Map ends: $actual_map\n" if $debug; + $sys_connect_total{"##global"} += $timestamp; + $sys_connect_total{$actual_map} += $timestamp; + $pl_best_frags = 0; + undef $pl_best_nick; + if (defined(%pl_kills_local)) { + foreach $nick (keys %pl_kills_local) { + if ($pl_kills_local{$nick} > $pl_best_frags) { + $pl_best_frags = $pl_kills_local{$nick}; + $pl_best_nick = $nick; + } + } + if (defined($pl_best_nick)) { + $pl_maps_won{"##global"}{$pl_best_nick}++; + $pl_maps_won{$actual_map}{$pl_best_nick}++; + print "$pl_best_nick wins $actual_map with $pl_best_frags\n" if $debug; + } + } + pl_disconnect_all(); + + # Print out skill log + if (defined($pl_best_nick)) { # If no one won the map, why bother? + print SKILLOG "W:$pl_best_nick\n"; + } + } + + + # Check for a newly connecting player. Initialize all fields, if necessary. + # $weapon holds player name. + + if ($action eq "PlayerConnect") { + + pl_connect($weapon); + + } + + + # If a player disconnects, log his online time. + # $weapon holds the player name. + + if ($action eq "PlayerLeft") { + + pl_disconnect($weapon); + + } + + + # If a player renames himself, consider this a disconnect and immediate + # reconnect. + # $weapon holds the old name, $fragdiff the new one. + # Preserve frags in the local map! Important for winning caclulations + # WARNING! We might get into trouble here. If a player wins a map, + # and renames during the ending music, the "new" player will win the + # map (since he inherits the kills), but the map will not count as + # played (since he was neither fragged, nor fragged another player). + # PS: this is not theoretical ;) + + if ($action eq "PlayerRename") { + + $tmp = $pl_kills_local{$weapon}; + print "$weapon renamed to $fragdiff, inheriting $tmp\n" if $debug; + # If the map counts for the "leaving" player, decrease + # his mapcount, and increase the count of the "connecting" player. + unless(defined($pl_count_map{$weapon})) { + $pl_maps_played{"##global"}{$weapon}--; + $pl_maps_played{$actual_map}{$weapon}--; + print "Map count for $weapon decreased to $pl_maps_played{\"##global\"}{$weapon}\n" if $debug; + } + pl_disconnect($weapon); + pl_connect($fragdiff); + unless(defined($pl_count_map{$weapon})) { + $pl_maps_played{"##global"}{$fragdiff}++; + $pl_maps_played{$actual_map}{$fragdiff}++; + print "Map count for $fragdiff increased to $pl_maps_played{\"##global\"}{$fragdiff}\n" if $debug; + } + $pl_kills_local{$fragdiff} = $tmp; + } + +} + +# Just to be sure.... + +pl_disconnect_all(); + +# Write out all results. Phew. + +foreach $mapkey (keys %pl_kills) { + + if ($mapkey eq "##global") { + $filename = "big.res"; + } else { + $filename = $mapkey . ".res"; + } + + + open(LOGFILE, ">$filename") or die "Could not open $filename: $!\n"; + + select LOGFILE; + + # Print final results. First line holds overall system statistics. + + print ":"; + print "$sys_kills{$mapkey}:"; + print ":"; + print "$sys_suicides{$mapkey}:"; + print "$sys_maps_played{$mapkey}:"; + print ":"; + print "$sys_connect_total{$mapkey}:"; + print "\n"; + + foreach $nick (keys %{ $pl_kills{$mapkey} }) { + + print "$nick:"; + print "$pl_kills{$mapkey}{$nick}:"; + print "$pl_victims{$mapkey}{$nick}:"; + print "$pl_suicides{$mapkey}{$nick}:"; + print "$pl_maps_played{$mapkey}{$nick}:"; + print "$pl_maps_won{$mapkey}{$nick}:"; + print "$pl_connect_total{$mapkey}{$nick}:"; + print "\n"; + + } + + select STDOUT; + + close (LOGFILE); + +} + + +###### - Subroutines + +sub pl_connect() { + + $pl_name = shift; + return unless defined($pl_name); + + # Reduce the player name to the first 15 characters. You want that. + # Believe me. + + $pl_name = substr($pl_name, 0, 15); + + print "Player connected: $pl_name\n" if $debug; + + $pl_kills{"##global"}{$pl_name} = 0 unless defined($pl_kills{"##global"}{$pl_name}); + $pl_kills{$actual_map}{$pl_name} = 0 unless defined($pl_kills{$actual_map}{$pl_name}); + + $pl_victims{"##global"}{$pl_name} = 0 unless defined($pl_victims{"##global"}{$pl_name}); + $pl_victims{$actual_map}{$pl_name} = 0 unless defined($pl_victims{$actual_map}{$pl_name}); + + $pl_suicides{"##global"}{$pl_name} = 0 unless defined($pl_suicides{"##global"}{$pl_name}); + $pl_suicides{$actual_map}{$pl_name} = 0 unless defined($pl_suicides{$actual_map}{$pl_name}); + + $pl_maps_played{"##global"}{$pl_name} = 0 unless defined($pl_maps_played{"##global"}{$pl_name}); + $pl_maps_played{$actual_map}{$pl_name} = 0 unless defined($pl_maps_played{$actual_map}{$pl_name}); + + $pl_maps_won{"##global"}{$pl_name} = 0 unless defined($pl_maps_won{"##global"}{$pl_name}); + $pl_maps_won{$actual_map}{$pl_name} = 0 unless defined($pl_maps_won{$actual_map}{$pl_name}); + + + + # If the player reconnects before a map change, don't count as + # a played map + # This flag is reset by pl_disconnect_all(). + + unless (defined($pl_connect{$pl_name})) { + $pl_count_map{$pl_name} = 1; + } + + $pl_connect{$pl_name} = 1; + $pl_kills_local{$pl_name} = 0; + $pl_connect_start{"##global"}{$pl_name} = $timestamp; + $pl_connect_start{$actual_map}{$pl_name} = $timestamp; +} + +# ---------------------- + +sub pl_disconnect { + + $pl_name = shift; + return unless defined($pl_name); + + print "Player left: $pl_name with $pl_maps_played{\"##global\"}{$pl_name} maps played, $pl_maps_won{\"##global\"}{$pl_name} maps won\n" if $debug; + + $pl_connect_total{"##global"}{$pl_name} += ($timestamp - $pl_connect_start{"##global"}{$pl_name}); + $pl_connect_total{$actual_map}{$pl_name} += ($timestamp - $pl_connect_start{$actual_map}{$pl_name}); + $pl_connect_start{"##global"}{$pl_name} = -1; + delete $pl_kills_local{$pl_name}; +} + +# ---------------------- + +sub pl_disconnect_all { + + foreach $name (keys %pl_connect) { + + undef $pl_connect{$name}; + undef $pl_count_map{$name}; + if ($pl_connect_start{"##global"}{$name} >= 0) { + pl_disconnect($name); + } + undef %pl_kills_local; + } +} diff --git a/gs_analyze/mapnames.txt b/gs_analyze/mapnames.txt new file mode 100644 index 0000000..b88b1c1 --- /dev/null +++ b/gs_analyze/mapnames.txt @@ -0,0 +1,11 @@ +q2dm1:The Edge +q2dm2:Tokay's Towers +q2dm3:The Frag Pipe +q2dm4:Lost Hallways +q2dm5:The Pits +q2dm6:Lava Tomb +q2dm7:The Slimy Place +q2dm8:WareHouse +match1:Reckless Abandon +nexus2:Rusted … by Shadowdane +trdm01a:Sepulchre -by Trebz- diff --git a/server/README b/server/README new file mode 100644 index 0000000..02746e7 --- /dev/null +++ b/server/README @@ -0,0 +1,4 @@ +README quakec5.pl +================= + +Ein Perl-Skript, das diff --git a/server/jff.template b/server/jff.template new file mode 100644 index 0000000..a574012 --- /dev/null +++ b/server/jff.template @@ -0,0 +1,98 @@ + + + +

Serverstatus

+
+ Letztes Update:

+ (-aktualisieren-)
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Server   
 Map 
 Game Mod 
 Game Dir 
 Features 
 Fraglimit 
 Timelimit 
 DMFlags 
 Version 
+

+ + Diese Spieler sind zurzeit auf dem Server:

+ + + + + + + + + + + + + +
 Playername  Frags  Ping 
+ + + Derzeit keine Spieler auf dem Server + +



+ (Script wurde erstellt mit freundlicher Hilfe von [NDC]Maria)
+ - www.ndc.sh -
+ + diff --git a/server/mapnames.txt b/server/mapnames.txt new file mode 100644 index 0000000..b88b1c1 --- /dev/null +++ b/server/mapnames.txt @@ -0,0 +1,11 @@ +q2dm1:The Edge +q2dm2:Tokay's Towers +q2dm3:The Frag Pipe +q2dm4:Lost Hallways +q2dm5:The Pits +q2dm6:Lava Tomb +q2dm7:The Slimy Place +q2dm8:WareHouse +match1:Reckless Abandon +nexus2:Rusted … by Shadowdane +trdm01a:Sepulchre -by Trebz- diff --git a/server/ndc.template b/server/ndc.template new file mode 100644 index 0000000..6c82106 --- /dev/null +++ b/server/ndc.template @@ -0,0 +1,166 @@ + + + + + + + NDC Serverstatus + + + + + +
+ [SERVER Status] +
+

+ + + + +
+ Serverstatus +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Adresse: + + Port: + + Map Thumbnail +
+ Server-Name: + + +
+ Systemlast: + + +
+ Server-Mod: + + +
+ Features: + + +
+ dmflags: + + +
+ Timelimit: + + +
+ Fraglimit: + + +
+ Spieleranzahl: + + / +
+ Momentan gespielte Map: + + +
+
+ + + + + + + + + + + + + + + + + +
+ Rank + + + Name + + + + Frags + + + + Ping + +
+ + + + + + + +
+ + + + + + +
+ Zur Zeit sind keine Spieler auf dem Server +
+ +

+ + Skripting by ADDIX
+ www.addix.de +
+ + diff --git a/server/ndcstrict.template b/server/ndcstrict.template new file mode 100644 index 0000000..f93f443 --- /dev/null +++ b/server/ndcstrict.template @@ -0,0 +1,163 @@ + + + + + + NDC Serverstatus + + + + + + + +

+ [SERVER Status] +

+
+

+ Serverstatus +

+
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Adresse: + + Port: + + Map Thumbnail +
+ Server-Name: + + +
+ Systemlast: + + +
+ Server-Mod: + + +
+ Features: + + +
+ dmflags: + + +
+ Timelimit: + + +
+ Fraglimit: + + +
+ Spieleranzahl: + + / +
+ Momentan gespielte Map: + + +
+ +

+ +

+ + + + + + + + + + + + + + + +
+ Rank + + + Name + + + + Frags + + + + Ping + +
+ + + + + + + +
+ + +
+

+ Zur Zeit sind keine Spieler auf dem Server +

+
+ +

+ Skripting by ADDIX
+ www.addix.de +

+ + diff --git a/server/quakec5.pl b/server/quakec5.pl new file mode 100644 index 0000000..ab3f6bc --- /dev/null +++ b/server/quakec5.pl @@ -0,0 +1,444 @@ +#!/usr/bin/perl + +# quakec5.pl +# NDC Code Release 1 +# +# Connects to a Quake2 server, queries current map, players, mod +# and various other stuff, and builds a web page from that. +# Templates are supported. +# CGI-Parameters: +# server: IP or FQDN of server. Defaults to 194.64.167.5 +# port: Port. Defaults to 27910 +# template: Template file. Defaults to ndc +# +# Copyright (C) 2001 Andreas Ulbrich, Ralf Ertzinger (ndccode@ndc.sh) +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +#use strict; +require 5.002; +use Socket; +use Sys::Hostname; +use DBI; +use CGI; + +# Define some variables +my %eingabe; +my %variables; +my %mapnames; +my $mappath = "/maparchiv"; # Path to map thumbnails +my $template_path = "."; # Path to templates. +my $mapnamefile = "mapnames.txt"; +my $scriptpath = "http://www.ndc.sh/cgi-bin/quake/quakec5.pl"; # The script itself when called by HTTP +my $quakeresponse; +my $template; +my $template_file; +my $CGIquery; + +# Info about the script +$variables{parser_selfinfo} = ""; + +### Var def ### +$CGIquery = new CGI; +$variables{server_address} = ($CGIquery->param("server")?$CGIquery->param("server"):"194.64.167.5"); +$variables{server_port} = ($CGIquery->param("port")?$CGIquery->param("port"):"27910"); +$sort = ($CGIquery->param("sort")?$CGIquery->param("sort"):0); +$template = ($CGIquery->param("template")?$CGIquery->param("template"):"ndc"); + +# Load map names +if (-e $mapnamefile) { + open(MAPNAMES,$mapnamefile); + while ($line=) { + ($maphandle,$mapn) = split(":",$line); + chomp($mapn); + $mapname{$maphandle} = $mapn; + } + close(MAPNAMES); +} + +$quakeresponse = QueryQuakeServer("status"); + +### Ausgabeformatierung ### +## Abtrennen der ersten Zeile mit den Systeminformationen ### +@ausg = split (/\n/,$quakeresponse); + +## Zuweisen der Ausgabevariablen zu $variable{wasausgegebenwerdensoll} ## +@config = split (/\\/,$ausg[1]); +for ( $i = 1; $i < $#config; $i= $i + 2) { + $var = $config[$i]; + $variables{"server_${var}"} = $config[$i + 1]; +} + +## Zaehlen der Onlinespieler ## +$anzplayer = scalar(@ausg) - 2; +$variables{server_actclients} = $anzplayer; + +#### Umfomartieren der Spielernamen +foreach $i (2..($#ausg)) +{ + + @playerdata = ($ausg[$i] =~ /^(\d+)\s(\d+)\s"(.+)"$/); + $name = $playerdata[2]; + $pings{$name} = $playerdata[1]; + $frags{$name} = $playerdata[0]; + $nicks{$name} = $name; + $nicks{$name} =~ s/&/&/g; + $nicks{$name} =~ s//>/g; + $nicks{$name} =~ s/"/"/g; +} + + +## Mapnamen auf vollen Namen erweitern (wenn möglich) +if (defined($mapname{$variables{server_mapname}})) { + $variables{server_map} = $mapname{$variables{server_mapname}} . " (". $variables{server_mapname} . ")"; +} else { + $variables{server_map} = $variables{server_mapname}; +} + +#### Ermittlung der Load falls moeglich ##### +$load = "N/A"; + +$variables{server_load} = $load; +$variables{server_load_color} = "" . $load. ""; +if ($load <= 0.7) { + $variables{server_load_color} = "$load"; +} +if (($load > 0.7) && ($load < 1)) { + $variables{server_load_color} = "$load"; +} +if ($load >= 1) { + $variables{server_load_color} = "$load"; +} + + +###### Sortieren ##### + +# By default, sort by frags. +@sortkey = sort { $frags{$b} <=> $frags{$a} } (keys %frags); +$sortname = "Frags"; + +if ($sort eq "0") { + @sortkey = sort { $frags{$b} <=> $frags{$a} } (keys %frags); + $sortname = "Frags"; +} + +if ($sort eq "1") { + @sortkey = sort { $pings{$a} <=> $pings{$b} } (keys %pings); + $sortname = "Pings"; +} + +if ($sort eq "2") { + @sortkey = sort { $nicks{$a} cmp $nicks{$b} } (keys %nicks); + $sortname = "Nick"; +} + +$variables{parser_sortmode} = "Sortiert nach $sortname"; + +#### Ermittlung und formatierung des Datums ##### +$date_command = "/bin/date"; +$date = `$date_command +"%T Uhr \ \; %d.%m.%Y"`; +chop($date); +$variables{server_date} = $date; + +#### Bild von Map? ##### + +if (-e "$mappath/$variables{server_mapname}/$variables{server_mapname}_1_thumb.jpg") { + $variables{map_thumbnail} = "http://www.ndc.sh/maparchiv/$variables{server_mapname}/$variables{server_mapname}_1_thumb.jpg"; +} else { + $variables{map_thumbnail} = "http://www.ndc.sh/maparchiv/blank.gif"; +} + +## Variables for different sorting +$variables{parser_selfsortname} = $scriptpath . "?server=" . $variables{server_address} . "&port=" . $variables{server_port} . "&sort=2"; +$variables{parser_selfsortfrags} = $scriptpath . "?server=" . $variables{server_address} . "&port=" . $variables{server_port} . "&sort=0"; +$variables{parser_selfsortping} = $scriptpath . "?server=" . $variables{server_address} . "&port=" . $variables{server_port} . "&sort=1"; + + +## Ausgabe ## + +# Define variables used by if and loop statements +$in_if_clients = 0; +$in_if_noclients = 0; +$in_loop_players = 0; + +# Check template file +if ($eingabe{template} =~ /\W/) { + # template file contains illegal characters + $template_file = $template_path . "/ndc.template"; +} else { + $template_file = $template_path . "/" . $eingabe{template} . ".template"; +} + +if ( ! -e $template_file ) { + $template_file = $template_path . "/ndc.template"; +} + +# Start by printing content type +print "Content-Type: text/html\n\n"; + +open (TEMPLATE, $template_file) or die "Could not open template file: $!\n"; +@main_source=