From 8fd75ca80726a4dccf51ea89e64bd22fabb2ac88 Mon Sep 17 00:00:00 2001 From: zimbelstern Date: Fri, 23 Oct 2020 19:39:52 +0200 Subject: [PATCH] Initial commit --- .htaccess | 1 + LICENSE | 21 +++++++ README.md | 20 +++++++ favicon-152.png | Bin 0 -> 8363 bytes favicon-16.png | Bin 0 -> 688 bytes favicon-32.png | Bin 0 -> 1401 bytes favicon.ico | Bin 0 -> 5430 bytes favicon.svg | 66 +++++++++++++++++++++ games/.htaccess | 1 + index.php | 135 +++++++++++++++++++++++++++++++++++++++++++ lib/.htaccess | 1 + lib/config.php | 8 +++ lib/erstellen.php | 47 +++++++++++++++ lib/erstellt.php | 55 ++++++++++++++++++ lib/getBaseUri.php | 12 ++++ lib/teilgenommen.php | 89 ++++++++++++++++++++++++++++ lib/teilnehmen.php | 46 +++++++++++++++ lib/wichtelDB.php | 116 +++++++++++++++++++++++++++++++++++++ res/.htaccess | 1 + res/weihnachtscodes | 73 +++++++++++++++++++++++ res/zahlwoerter | 12 ++++ style/wichteln.css | 128 ++++++++++++++++++++++++++++++++++++++++ 22 files changed, 832 insertions(+) create mode 100644 .htaccess create mode 100644 LICENSE create mode 100644 README.md create mode 100644 favicon-152.png create mode 100644 favicon-16.png create mode 100644 favicon-32.png create mode 100644 favicon.ico create mode 100644 favicon.svg create mode 100644 games/.htaccess create mode 100644 index.php create mode 100644 lib/.htaccess create mode 100644 lib/config.php create mode 100644 lib/erstellen.php create mode 100644 lib/erstellt.php create mode 100644 lib/getBaseUri.php create mode 100644 lib/teilgenommen.php create mode 100644 lib/teilnehmen.php create mode 100644 lib/wichtelDB.php create mode 100644 res/.htaccess create mode 100644 res/weihnachtscodes create mode 100644 res/zahlwoerter create mode 100644 style/wichteln.css diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..8cb1c1c --- /dev/null +++ b/.htaccess @@ -0,0 +1 @@ +Options -Indexes -MultiViews diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8127420 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Walfried Schneider + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..190a0f3 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# 🎄 Wichtelverlosungen +Dieses Programm stellt eine Web-Oberfläche zur Verfügung, auf der Verlosungen durchgeführt werden können, bei denen jeder teilnehmenden Person ([Wichtel](https://de.wikipedia.org/wiki/Wichteln)) geheim eine andere zugelost wird. Das Programm wurde in PHP und SQL geschrieben und basiert auf einem datenschutzfreundlichen, ausgeklügelten Prinzip, bei dem keine E-Mail-Adressen benötigt werden. Die Angabe des (Spitz-)Namens genügt. + +## 📃 Anleitung + +### 🦌 Wichtelverlosungen erstellen +Zum Erstellen von Verlosungen muss mit dem Browser in das Installationsverzeichnis navigiert werden. Nun müssen ein möglichst eindeutiger Titel und die genaue Anzahl der Wichtel festgelegt werden. Verlosungen mit nur drei Wichteln sind möglich, das Ergebnis einer solchen Verlosung ist allerdings aus logischen Gründen nie geheim. + +Mit der Wichtelverlosung wird ein Link erstellt, der nun an alle Wichtel weitergegeben werden muss. + +### 🎁 An Wichtelverlosungen teilnehmen +Alle Wichtel benötigen den Link, um zur Verlosung zu gelangen. Dort müssen sie zunächst nur ihren Namen eintragen, um im Lostopf zu landen. Anschließend erhalten sie einen Weihnachtscode (Passwort), der später benötigt wird, um das personalisierte, geheime Ergebnis der Verlosung einzusehen. Wenn sich *alle* Wichtel angemeldet haben, wird automatisch jedem Wichtel eine andere Person zugelost. Mit ihrem persönlichen Weihnachtscode können sich die Wichtel nun erneut einloggen, um zu sehen, wen sie beschenken werden. + +## 📦 Installation +Auf dem Webserver muss PHP und die Bibliothek *php-sqlite3* installiert sein. Die Dateien müssen entpackt und auf dem Server abgelegt werden. Ein Hintergrundbild ist aus rechtlichen Gründen nicht in diesem Repository enthalten, muss separat [über pixabay.com](https://pixabay.com/photos/christmas-new-year-s-eve-postcard-1911637/) heruntergeladen und als background.jpg im Verzeichnis images abgelegt werden. + + +### ⚙ Konfiguration +Die Konfiguration kann in der Datei `lib/config.php` geändert werden. Nach der Installation läuft das Programm zunächst im Demo-Modus. Im Demo-Modus kann prinzipiell jeder Verlosungen erstellen, jedoch werden alle Verlosungen, die länger als fünf Minuten nicht mehr geändert wurden, gelöscht. Das Ändern des Wertes `"demo"` von `true` zu `false` deaktiviert den Demo-Modus. Das Erstellen von Verlosungen ist dann nur noch mit einem der Server-Passwörter in der Liste `"serverpasswords"` möglich; Verlosungen bleiben aber zeitlich unbegrenzt erhalten. +Beim Abschalten des Demo-Modus empfiehlt es sich zudem, ggf. vorhandene `.sql`-Dateien (*nicht* die `.htaccess`-Datei!) im games-Verzeichnis zu löschen. diff --git a/favicon-152.png b/favicon-152.png new file mode 100644 index 0000000000000000000000000000000000000000..4702558ec7f671014577b6b3c583ee9ee60ca590 GIT binary patch literal 8363 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 literal 0 HcmV?d00001 diff --git a/favicon-16.png b/favicon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..c18021c3611c73bea235f27d67a37e7461d90d11 GIT binary patch literal 688 zcmV;h0#E&kP)s7!ne*_%VpJa8(2s+o^v+At*>XE0oqn=pYtBC`fN&G@9I-54|yoF}e5cP<0Tz z@i(32Ip_Dh=LK%z{r<(c#gd8Y_0n;3v&fB(#`r*h!BgPe?jMPvAz}ey0piBTNfZQ% z)YsGb;NTy*tdjTp7a>XSUWLPWHZlSL(D{7GheDu20V2;EWM7YWbzQOmrGi0{uCM8& zy`8d4OLW@NL99|q>8Yvra(P8Wt0gKH0RXk#-O%>-dZAKXl=k*Msaslp8$uzQtifq# zXXRpTjmj)bnS}*PO;3->1|Gt>TyQQ zUtfnL2%t&@HD>dhQZ{?Ud%d5ZWRY|@zOw+uj7BQ%>`>+GjL!S|hy^Hav1Br{vyaX} zad$}he5)i$lUl3wc{&(`$Z-IG8j}exJRb4p;NX|CwbjwIvJ!vPL|~Yv#PIOXh(_~& zppPsav>$h+NNiDA^TmC`da*2KU-ys))JyvK9Dp^>^e$}TSxKQWQW z%+FWE`H&;ypdYs#KJ;+jkY!F1ciwm)D1f-)ha~x9YYw zbvh7$BnSWiRb!)6)#Bb}Zq9Pv-~acn4hs-BHWsdG@Q`#M@G-x={XyB#P%PVQum1rI WxfKkGhPs&m0000 literal 0 HcmV?d00001 diff --git a/favicon-32.png b/favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..ef52e4c9ac31a1a3882577171b30727641b8ed6b GIT binary patch literal 1401 zcmV-<1%~>GP)miVGgqhb?%F~%D8p`<1dO|?ii*w@k>u3-o=*x6wfc&&pdg|Hz}bV6%hA)@i{{c&G|6O)^YGyxQ$~y= znQm)n7&l~R#}Q8t@A>nHh=?4AR7nZy0MJrV;dY)ry<)Dsg6RwU@bF)RK(Jh9FhFK~ zeOw?R7Q-h84*~!{=<#D<#>b=Aj~?YRPoDfbR{;P3;5c;XnrYD@Aib#8VNs>~dRLbfA(4kf%vMeGZvR*Hm*RSVE0z*U5`#vA)C6X8c zPL1a5+_P7!e~QU;|9-?s1Q8Jz2Cm1xM##o)*YBFmz$uWxqt^qk27AdMLv-8u8d zyBjwELm|k&c@v1tOc2TCz>JQ9wXzaKB_#ln2p>y`#gML0sNmtlISU|6G8q%0sI=J= zSvz+Egu}pjy%QM<#SRn*Smwox>wyOkRsqWb0DwfP{B6PQ+wmRyA<(C%$1gd8Kx1Jc z>I4Gx_Vg^98Sm=oXr5?p{)1MlFDFGj4MR>2rvpHJS{mAFYth%&hY^bf14BcoBZxQw zDF;ZX!v>?W`XJPgmCxdsEXhlT3!bOP7$6%M%jo#bWgJ z^+lKP_&8dttI=Fq>UVW?98S6#u8xjo^SX83MC8=+<}s$&+=~ zswz6>-vJRBg8?m@Hz%~nAdzq>JzkwhkACkT96Xs>QzOdUx)oe)ZNPav3F9*=D_to+ z-)WM}hS#reO!fEg;Qao??-vRor@dX7YJMKhuC5AOZS9*x<+pF&{_LZX&xE73wbLY* z2WOHS^YU2FnKPgLF9HCfw$MuDplRVk#Z_4M4|0%pvHVIA#200000NkvXX Hu0mjfaLttO literal 0 HcmV?d00001 diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0ad7543871335b4163f4182b554bf87133057d80 GIT binary patch literal 5430 zcmcgwdrVVj6u*dXjNp9CCt}3+qA0#KVLCyBk4z1UPuv6*R1i=^V0x7qm-yJ?YbO4w zGn1H^xVY$&WoV+t_=o=C5{VhKr7fksZ7GOU`Zznk+ugQwEp|}-lGE?@-0wW@`ObG9 zpCCjDJ%qS8f#(EaPftOZCBnXTz;R(>yk(X!wCNWWC zPfpfaMX|1LxO_@Wr8&!%HT*3IwWPq-t;S#8M=y%DPckwZ9~?h!bzHyRLIVe?y!3+y zt6iPZ@7^taH+rE>1%KOz3_3bd!^LJt{AkMs=j}{M)dh@eh0>e=9wB&_;T_ zla?-Rka^6Rqq7`5XjvVM4!HgMO~p}BzCD3mjvlp8L4jo3wafH%`Gztx z8|A&hx5KWY*fLC6)7d;@hSquZY!lViI;f(;LPbT=f9%>BeZPJlTjTp@&C;^o=A5D; zb4E&vzJBv&WoKjuIV`T z+36(OxUo^T`I9Ghx^ksie&%yx>5Lxlva*bSu32O7?)i=#Mrv+$QUCsRv|>fWtM}34 zJ@mj{v!A(#4_CYR+ckN4Ch>i=)FcR0&As0C3C$ zBG1+QA8{su;d2JWBYAM(k@x}dF^4D`2V`a%e;YMQ;}|zi^RA%4wEJVp$2me=gfA&D zWQf{TUTz)xA$15AR~7k~SFJL<_z?18YsBxE7!|vX@0$ak5l{F$Zj7W3d-h1*#>cDM zaZavXYoS4dR9>40%E$kC^K=n$#gY

cWM3BY2)U(?rTpsT{Omfi9#D9vgMt0*IyS z*Ec>=@(Sc57hSw)Q&gb#b~hb9Y$pF$uGk_it>JZ7rE?BAH*%!LsqhM%Io6ZK;_~Wo z@7`N){=#=}+GM=@f9eE9&-{E#`s~>{Y3^Jd-MQ0BNlDs}_Dx985MnOI-Mg(6AFrX* zRD+glhq(&BaOb={Es-xx08|1hSzHM!8%FB~N>VWmgxty=z?D!Gu&t7OT_2-^L1pkdi>XBa}oP%NF89G#f$YcVuW1BT@O~rg(Dv|qH<0#=jVHB z55>M$uQtoMKX5+~OViUE{;H_3O$bL$ur)Z3fqd~FH8E;qWxRa(4)*ohg6pB?!a~dD zU_8Uc9XMeA8s891K5(e*Z`^2+RcLB*5#syMp=#IOz0yxrRm4?E_r~PO^>0JT_Q!KQ zO=HJuh-lrv-IMB}Mtv}Td_D0wp{Y|t`#JPLZ&h3@eHjV43J>_r`SZSf@# zIL69-up(QT*RC}X$6#8tNN?c!W3DS%=tPQX+lP9UZuj|54$GdHZ%x&juef8l5y{O1+#{pFXwAK8al8zn=Byy07a4 zH5~eX@Wh=0{2l{w4t=X43;u|KToe=2(PvN}bX@~M;CqX!xFbLXl)XHaT;H=7B*2))o-A2}kS-Hpg#+g?Vz1@AyW9dz=fRnEUSw>de|4-pX>zyx<| zI2VY$Tz5KPdjMoES)y0t{znw`{R7Cl^q04@k|B!7$(_l79hfQ)C*@L6V*6{sA|n%trtK literal 0 HcmV?d00001 diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 0000000..52e8364 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,66 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/games/.htaccess b/games/.htaccess new file mode 100644 index 0000000..3a42882 --- /dev/null +++ b/games/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/index.php b/index.php new file mode 100644 index 0000000..1a5a0be --- /dev/null +++ b/index.php @@ -0,0 +1,135 @@ + + Hier kann man eine Wichtelverlosung erstellen. + '; + $msg3 = 'Zur Teilnahme an einer Verlosung braucht man einen speziellen Link.'; +} + +// Pages for game creation +else if ($_SERVER['QUERY_STRING'] == "verlosung-erstellen"){ + if (isset($_POST['session_id'])) { + // Include response for new game request + if ($_POST['session_id'] == session_id()) { + include("lib/erstellt.php"); + } + // Redirect to prevent processing a request twice + else { + header('Location: ?verlosung-erstellen'); + exit(); + } + } + // Include page to create a game + else { + include("lib/erstellen.php"); + } +} + +else if (file_exists("games/{$query}.db")) { + if (isset($_POST['session_id'])) { + // Include logged-in page + if ($_POST['session_id'] == session_id()) { + include("lib/teilgenommen.php"); + } + // Redirect to prevent processing a request twice + else { + header('Location: ?' . $query); + exit(); + } + } + // Include login page + else { + include("lib/teilnehmen.php"); + } +} + +// If query string is nonsense, show error page +else { + http_response_code(404); + $htmltitle = 'Fehler 404: Verlosung nicht gefunden – Wichtelverlosung'; + $msg1 = 'Diese Verlosung wurde hier nicht gefunden.'; + $msg2 = ' + Hier geht es zur Startseite + '; + $msg3 = 'Oder ist nur ein Tippfehler im Link?'; +} + +?> + + + + + + + <?php echo $htmltitle; ?> + + + + + + + + +

+
+
+
+
+

+ + +

+

+ + +

+

+ + +

+ + +

+ + +

+
+
+
+
+
+ + Ein Projekt von Walfried Schneider.
+ + Geschrieben in PHP, SQL, HTML und CSS. +
+
+
+
+ + diff --git a/lib/.htaccess b/lib/.htaccess new file mode 100644 index 0000000..3a42882 --- /dev/null +++ b/lib/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/lib/config.php b/lib/config.php new file mode 100644 index 0000000..410a35a --- /dev/null +++ b/lib/config.php @@ -0,0 +1,8 @@ + true, + +// A list of passwords required to create a game. +"serverpasswords" => array("password1", "password2") +); +?> diff --git a/lib/erstellen.php b/lib/erstellen.php new file mode 100644 index 0000000..0845e1e --- /dev/null +++ b/lib/erstellen.php @@ -0,0 +1,47 @@ + + + + '; +if (CONFIG['demo']) { +$passfield = ' +
+   Demo-Modus (Testen für 5 Minuten) +
'; +} + +// Set messages and create formular +$msg1 = $htmltitle; +$msg2 = "Titel der Verlosung und Anzahl der Wichtel eintragen."; +$msg4 = '
+
+
+ +
+
+ + +
+
+
+
+ + +
+
+
'.$passfield.' +
+ +
+
+
+'; +$msg5 = "Übrigens: Hier muss ein Cookie angelegt werden."; + +?> diff --git a/lib/erstellt.php b/lib/erstellt.php new file mode 100644 index 0000000..2fcedf4 --- /dev/null +++ b/lib/erstellt.php @@ -0,0 +1,55 @@ + + + +'; + +// If strings are valid and game does not yet exist, create game +// Else set corresponding error messages +if (titleIsValid($_POST['titel'])) { + if (numberIsValid($_POST['anzahl'])) { + if (CONFIG['demo'] || serverpassIsValid($_POST['serverpass'])) { + $dbtitle = $_POST['titel']; + $dbname = str_replace(' ', '', strtolower(iconv("utf-8","ascii//TRANSLIT", $dbtitle))); + $dbnum = intval($_POST['anzahl']); + if (!gameExists($dbname)) { + createGame($dbname, $dbtitle, $dbnum); + $gamelink = getWichtelBaseUri($dbname); + $htmltitle = "Die Wichtelverlosung wurde erstellt"; + $msg1 = "Die Wichtelverlosung wurde erstellt."; + $msg2 = 'Die Verlosung findest du unter folgendem Link:
' . $gamelink .''; + $msg3 = "Gib diesen Link an alle Wichtel weiter."; + $msg4 = ""; + if (CONFIG['demo']) { + $msg5 = "Demo-Modus: Die Verlosung wird nach fünf Minuten automatisch gelöscht!"; + } + session_regenerate_id(); + } + else { + $msg3 = "Eine Verlosung mit ähnlichem Namen existiert schon."; + } + } + else { + $msg3 = "Das eingegebene Serverpasswort ist nicht gültig."; + } + } + else if (intval($_POST['anzahl']) == 2) { + $msg3 = "Zwei Wichtel? Bist du dir sicher, dass du das mit dem Wichteln verstanden hast?"; + } + else { + $msg3 = "Die Teilnehmeranzahl liegt nicht zwischen 3 und 100."; + } +} +else { + $msg3 = "Der Titel enthält ungültige Zeichen. Es sind nur deutsche Buchstaben, Zahlen und Leerzeichen erlaubt."; +} + +?> diff --git a/lib/getBaseUri.php b/lib/getBaseUri.php new file mode 100644 index 0000000..52979b9 --- /dev/null +++ b/lib/getBaseUri.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/lib/teilgenommen.php b/lib/teilgenommen.php new file mode 100644 index 0000000..8e6258c --- /dev/null +++ b/lib/teilgenommen.php @@ -0,0 +1,89 @@ +getTitle(); +$htmltitle = $gametitle . " – Wichtelverlosung"; + +// Prevent log-in twice +session_regenerate_id(); + +// Big condition block +if (nameIsValid($username)) { + if (empty($code)) { + if (!$wdb->userExists($username)) { + if ($wdb->getWaitingNum()) { + $codes = file("res/weihnachtscodes", FILE_IGNORE_NEW_LINES); + $newcode = $codes[rand(0, count($codes) - 1)]; + $wdb->createUser($username, $newcode); + $msg1 = "Hallo, {$username}!"; + if ($wdb->getWaitingNum()) { + $msg2 = "Dein Weihnachtscode lautet:
{$newcode}
Bitte merke ihn dir gut, du brauchst ihn zum Einloggen."; + $msg3 = "Wir müssen noch auf " . $wdb->getWaitingNum() . " Wichtel warten. Dann wird ausgelost."; + } + else { + $wdb->doMapping(); + $beschenkt = $wdb->getMappedName($username); + $msg2 = "Du bist der letzte Wichtel, der sich angemeldet hat.
Bitte gib den anderen Bescheid, dass die Wichtel gemischt wurden.

Du beschenkst:
{$beschenkt}
Hast du schon eine Idee, worüber sich {$beschenkt} freuen würde?

Dein Weihnachtscode ist {$newcode}.
Merke ihn dir, falls du dich später noch mal einloggen möchtest."; + } + } + else { + $msg1 = "Es sind schon alle Teilnehmer angemeldet."; + $msg2 = "Tut mir leid, du bist wohl nicht dabei."; + } + } + else { + $msg1 = "Dieser Name wurde schon registriert."; + $msg2 = "Wenn du dich schon angemeldet hast, verwende deinen Weihnachtscode, um dich einzuloggen."; + } + } + else { + if ($wdb->userExists($username)) { + if (nameIsValid($code) && $wdb->passValid($username, $code)) { + $msg1 = "Hallo, {$username}!"; + if ($wdb->getWaitingNum()) { + $msg2 = "Wir müssen noch auf " . $wdb->getWaitingNum() . " Wichtel warten. Dann wird ausgelost."; + } + else { + if (!$wdb->hasReceivedName($username)) { + $msg3 = "Hast du schon eine Idee, worüber sich " . $wdb->getMappedName($username) . " freuen würde?"; + } + else { + $msgs = array("Schon vergessen?", "Sorry, daran können wir jetzt auch nichts mehr ändern.", "Nicht zufrieden?"); + $msg3 = $msgs[rand(0, count($msgs) - 1)]; + } + $msg2 = "Du beschenkst:
" . $wdb->getMappedName($username) . ""; + } + } + else { + $correctcode = substr($wdb->getPass($username), 0, 1); + $msg1 = "Der Weihnachtscode ist falsch."; + $msg2 = "Du solltest dir diesen Code doch merken!"; + $msg3 = "Kleiner Tipp: Dein Weihnachtscode fängt mit {$correctcode}... an."; + } + } + else { + $msg1 = "Dieser Name wurde noch nicht registriert."; + $msg2 = "Lass bei der ersten Anmeldung das Feld für den Weihnachtscode frei."; + } + } +} +else { + $msg1 = "Dein Name erhält ungültige Zeichen."; + $msg2 = "Kommst du mit dem deutschen Alphabet nicht aus?
Dann transkribiere deinen Namen bitte."; +} + +$msg4 = ' +
+ +
+'; + +?> diff --git a/lib/teilnehmen.php b/lib/teilnehmen.php new file mode 100644 index 0000000..3f15a05 --- /dev/null +++ b/lib/teilnehmen.php @@ -0,0 +1,46 @@ +getTitle(); + +// Set HTML title +$htmltitle = $gametitle . " – Wichtelverlosung"; + +// Set messages +$msg1 = $htmltitle; +$msg2 = "Namen eintragen, Weihnachtscode erhalten und wiederkommen, wenn alle angemeldet sind."; +$msg4 = '
+
+
+ + +
+
+ + + + +
+
+
+
+ + + + +
+
+ +
+
+
+'; +$msg5 = "Übrigens: Hier muss ein Cookie angelegt werden."; + +?> diff --git a/lib/wichtelDB.php b/lib/wichtelDB.php new file mode 100644 index 0000000..19f47f5 --- /dev/null +++ b/lib/wichtelDB.php @@ -0,0 +1,116 @@ +querySingle("SELECT wert FROM config WHERE schluessel = 'titel';"); + return $result; + } + + public function createUser($name, $pass) { + $this->exec("INSERT INTO spieler (name, passwort, erhalten) VALUES ('{$name}', '{$pass}', '0');"); + } + + function userExists($name) { + $result = $this->querySingle("SELECT COUNT(*) FROM spieler WHERE name = '{$name}';"); + return $result; + } + + public function passValid($name, $pass) { + $result = $this->querySingle("SELECT COUNT(*) FROM spieler WHERE name = '{$name}' AND passwort = '{$pass}';"); + return $result; + } + + public function getPass($name) { + $result = $this->querySingle("SELECT passwort FROM spieler WHERE name = '{$name}';"); + return $result; + } + + public function doMapping() { + $maxnum = $this->getMaxUserNum(); + $array = range(1,$maxnum); + shuffle($array); + for ($i = 1; $i <= $maxnum; $i++) { + while ($array[0] == $i or ($i+1 == $maxnum and $array[1] == $maxnum)) { + array_push($array, array_shift($array)); + } + $element = array_shift($array); + $this->exec("UPDATE spieler SET beschenkt = '{$element}' WHERE ROWID = '{$i}'"); + } + } + + public function getMappedName($name) { + $this->exec("UPDATE spieler SET erhalten = '1' WHERE name = '{$name}';"); + $result = $this->querySingle("SELECT B.name FROM spieler A, spieler B WHERE A.beschenkt = B.ROWID AND A.name = '{$name}';"); + return $result; + } + + public function hasReceivedName($name) { + $result = $this->querySingle("SELECT erhalten FROM spieler WHERE name = '{$name}';"); + return $result; + } + + public function getMaxUserNum() { + $result = $this->querySingle("SELECT wert FROM config WHERE schluessel = 'spieleranzahl';"); + return $result; + } + + public function getUserNum() { + $result = $this->querySingle("SELECT COUNT(*) FROM spieler;"); + return $result; + } + + public function getWaitingNum() { + $intnum = $this->getMaxUserNum() - $this->getUserNum(); + $numwords = file("res/zahlwoerter", FILE_IGNORE_NEW_LINES); + return ($intnum > 0 && $intnum < 13) ? $numwords[$intnum - 1] : $intnum; + } +} + +function titleIsValid($str) { + return !preg_match('/[^a-zA-Z0-9äöüßÄÖÜ \\-$]/', $str); +} + +function numberIsValid($str) { + return !preg_match('/[^0-9\\-$]/', $str) && intval($str) > 2 && intval($str) < 101; +} + +function serverpassIsValid($str) { + return in_array($str, CONFIG['serverpasswords']); +} + +function nameIsValid($str) { + return !preg_match('/[^a-zA-ZäöüßÄÖÜ\\-$]/', $str); +} + +function gameExists($db_name) { + return file_exists("games/{$db_name}.db"); +} + +function createGame($dbname, $dbtitle, $dbnum) { + $db = new SQLite3("games/{$dbname}.db"); + $db->exec("CREATE TABLE config (schluessel char(255), wert int(255));"); + $db->exec("INSERT INTO config VALUES ('titel', '{$dbtitle}');"); + $db->exec("INSERT INTO config VALUES ('spieleranzahl', '{$dbnum}');"); + $db->exec("CREATE TABLE spieler (name varchar(255), passwort varchar(255), beschenkt int(255), erhalten bool);"); + return true; +} + +function getWichtelBaseUri($dbname) { + require_once("getBaseUri.php"); + $baseUri = getExtendedBaseUri(); + $wichtelBaseUri = substr($baseUri, 0, strrpos($baseUri, '/')) . "?" . $dbname; + return $wichtelBaseUri; +} + +function cleanGameFiles() { + foreach(glob("games/*.db") as $file) { + if (is_file($file) && (time() - filemtime($file) > 300)) { + unlink($file); + } + } +} + +?> diff --git a/res/.htaccess b/res/.htaccess new file mode 100644 index 0000000..3a42882 --- /dev/null +++ b/res/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/res/weihnachtscodes b/res/weihnachtscodes new file mode 100644 index 0000000..5665854 --- /dev/null +++ b/res/weihnachtscodes @@ -0,0 +1,73 @@ +Orange +Tannenzapfen +Anis +Zimtstange +Zimtstern +Nelken +Adventskranz +Spekulatius +Lebkuchen +Printe +Kerze +Weihnachtsstern +Christkind +Weihnachtsbaum +Geschenk +Krippe +Walnuss +Nussknacker +Adventskalender +Kakao +Schlitten +Schneeballschlacht +Schneeflocke +Zipfelmütze +Weihnachtslied +Tannenbaum +Rentier +Glocke +Bescherung +Christstollen +Buttergebäck +Plätzchen +Mandelprinte +Christbaumkugel +Lametta +Strohstern +Kaminfeuer +Engel +Haselnuss +Vanillekipferl +Schlittschuh +Schlittenfahrt +Weihnachtsfest +Heiligabend +Nikolaus +Mandarine +Wichtel +Weihnachten +Kardamom +Nikolausstiefel +Glühwein +Weihnachtsmarkt +Bratapfel +Mandeln +Maronen +Tannenzweig +Fröbelstern +Lichterkette +Weihnachtspyramide +Pfefferkuchen +Lebkuchen +Lebkuchenhaus +Pfefferkuchenhaus +Baumkuchen +Weihnachtsgans +Geschenkpapier +Kamin +Feuerholz +Plätzchenteig +Weihnachtsgurke +Geschenkband +Krippenspiel +Orangenschale diff --git a/res/zahlwoerter b/res/zahlwoerter new file mode 100644 index 0000000..049b08a --- /dev/null +++ b/res/zahlwoerter @@ -0,0 +1,12 @@ +einen +zwei +drei +vier +fünf +sechs +sieben +acht +neun +zehn +elf +zwölf diff --git a/style/wichteln.css b/style/wichteln.css new file mode 100644 index 0000000..17eb595 --- /dev/null +++ b/style/wichteln.css @@ -0,0 +1,128 @@ +.hero.is-success.is-fullheight { + background: linear-gradient( + rgba(0, 0, 0, 0.5), + rgba(0, 0, 0, 0.5)), + url('../images/background.jpg') no-repeat center center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} + + +a { + position: relative; + font-weight: bold; +} +a:before { + content: ""; + position: absolute; + width: 100%; + height: 1px; + bottom: 0; + left: 0; + background-color: #fff; + visibility: hidden; + -webkit-transform: scaleX(0); + transform: scaleX(0); + -webkit-transition: all 0.3s ease-in-out 0s; + transition: all 0.3s ease-in-out 0s; +} +a:hover:before { + visibility: visible; + -webkit-transform: scaleX(1); + transform: scaleX(1); +} + + +.title { + text-shadow: 2px 2px 2px #aaa; +} +.subtitle { + padding-top: 1.25rem; +} +.subsubtitle { + font-weight: bold; +} +.subsubsubtitle { + padding-top: 1.25rem; + font-style: italic; +} + +.max-500 { + max-width: 500px; +} + +.largebold { + font-size: 150%; +} + +input { + font-weight: 300; +} +.input::-moz-placeholder, +.select select::-moz-placeholder, +.textarea::-moz-placeholder { + color:rgba(54,54,54,.9); +} +.input::-webkit-input-placeholder, +.select select::-webkit-input-placeholder, +.textarea::-webkit-input-placeholder { + color:rgba(54,54,54,.9); +} +.input:-moz-placeholder, +.select select:-moz-placeholder, +.textarea:-moz-placeholder { + color:rgba(54,54,54,.9); +} +.input:-ms-input-placeholder, +.select select:-ms-input-placeholder, +.textarea:-ms-input-placeholder { + color:rgba(54,54,54,.9); +} +.button.is-info { + background-color: #273e0e; +} +.button.is-info:hover { + background-color: #3b1807; +} + + +.arrow-left { + display: block; + width: 3em; + height: 3em; + border: 0.15em solid white; + border-radius: 50%; + margin: 20px auto; +} +.arrow-left::after { + content: ''; + display: inline-block; + margin-top: 0.85em; + margin-left: 0.3em; + width: 1em; + height: 1em; + border-bottom: 0.15em solid white; + border-right: 0.15em solid white; + transform: rotate(135deg); +} +.arrow-left:hover::before { + visibility: hidden; + -webkit-transform: none; + transform: none; +} + +.container.max-500 { + max-width: 500px; +} + + +.foot-content { + color: rgba(255,255,255,.8); + padding: 10px; +} +.foot-content > a { + color: inherit; +} +