From 70239e4902b31bbefcf0ea38dacabd83193fc0e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20G=C3=BCldenstein?= <git@lukasgueldenstein.de> Date: Fri, 22 Apr 2022 17:58:23 +0200 Subject: [PATCH] Adds basic working game over tcp/ip --- deutsch-filtered.txt | 4134 ++++++++++++++++++++++++++++++++++++++++++ deutsch.txt | 9 - src/client.cpp | 18 +- src/client.hpp | 18 +- src/client_main.cpp | 177 +- src/definitions.hpp | 2 + src/game.cpp | 99 + src/game.hpp | 35 + src/player.hpp | 6 +- src/server.cpp | 13 + src/server.hpp | 45 +- src/server_main.cpp | 67 +- src/util.hpp | 20 + wordle-de.proto | 39 +- 14 files changed, 4594 insertions(+), 88 deletions(-) create mode 100644 deutsch-filtered.txt create mode 100644 src/util.hpp diff --git a/deutsch-filtered.txt b/deutsch-filtered.txt new file mode 100644 index 0000000..1dcf13b --- /dev/null +++ b/deutsch-filtered.txt @@ -0,0 +1,4134 @@ +Aalen +Aases +Abart +Abbau +Abend +Abgas +Abort +Abruf +Absud +Abtei +Abtes +Abweg +Abzug +Achse +Acker +Addis +Adels +Adieu +Adolf +Adria +Aebte +Aeste +Aetna +Aexte +Affes +After +Agave +Agent +Ahlen +Ahorn +Akaba +Akten +Aktie +Alarm +Album +Algen +Alkor +Allah +Allee +Allen +Alpen +Alten +Alter +Altes +Amiga +Ammen +Amors +Ampel +Amtes +Anbau +Andre +Angel +Angst +Anker +Anmut +Annie +Anruf +Anwar +Apoll +Appel +Apple +April +Apsis +Arden +Areal +Arena +Argau +Argus +Arien +Arier +Armee +Armen +Armut +Arosa +Arsch +Arsen +Artus +Asche +Asind +Asket +Aspik +Astes +Asyls +Atari +Athen +Atome +Auges +Aurel +Autor +Autos +Axiom +B-Dur +BASIC +BASIK +Babel +Babys +Bades +Baien +Balls +Bambi +Bande +Bange +Banjo +Bantu +Baren +Bares +Barke +Baron +Basar +Basel +Basen +Basic +Batik +Bator +Bauch +Bauer +Baume +Bazar +Beben +Bebop +Beere +Beile +Beine +Beleg +Berge +Berta +Beruf +Besen +Betel +Beton +Betty +Beule +Beute +Bevor +Bezug +Biber +Biene +Biere +Billy +Birne +Bisse +Bitte +Biwak +Blase +Blatt +Blech +Blick +Blitz +Block +Blois +Bluff +Blume +Bluts +Bnsai +Bogen +Bohle +Bombe +Bongo +Bonns +Bonus +Bonze +Boote +Boots +Borke +Borte +Bosch +Bosse +Boten +Botha +Botin +Bowle +Boyen +Brady +Braue +Braus +Braut +Breie +Breis +Brest +Brett +Brief +Brise +Brite +Bruch +Brust +Buben +Buche +Buchs +Buden +Buett +Buges +Bulle +Bunde +Burda +Burma +Busch +Busse +Busse +C-Dur +COBOL +Cadiz +Camus +Canon +Capua +Carle +Carlo +Carol +Cathy +Celle +Cents +Chaos +Chase +Chefs +Chile +China +Chips +Choco +Choke +Chors +Civil +Clone +Clubs +Cluny +Coats +Cobol +Codes +Codex +Corps +Coupe +Coups +Crash +Creme +Crews +Croix +Curie +D-Zug +Dabei +Dachs +Daene +Dakar +Damen +Damit +Dandy +Dante +Daran +Darin +Datei +Daten +Datex +Datum +Dauer +Daune +David +Davon +Davor +Davos +Deich +Dekan +Dekor +Delle +Demut +Depot +Deren +Devon +Dhabi +Diaet +Diebe +Diebs +Diele +Diese +Dills +Dinar +Dirne +Disco +Discs +Diwan +Docks +Dogma +Dohle +Dolly +Domes +Doris +Dorne +Dorns +Dosen +Dosis +Dover +Draht +Drama +Dress +Drift +Drink +Droge +Droht +Druck +Duell +Duene +Duese +Duett +Dumme +Dunst +Durch +Durst +Dusel +Ebben +Ebene +Ebert +Echos +Echte +Ecken +Edeka +Edens +Efeus +Egeln +Egels +Ehren +Eiben +Eiche +Eiden +Eides +Eiern +Eifel +Eifer +Eigen +Eimer +Einen +Einer +Eines +Eisen +Eises +Eiter +Ekels +Eklat +Ekzem +Elans +Elend +Elias +Elite +Email +Endes +Endet +Engel +Enkel +Enzym +Epcot +Erbin +Erbse +Erich +Erika +Erlen +Ernst +Ernte +Erzen +Erzes +Esche +Eseln +Essig +Etage +Etats +Ethik +Ethos +Etwas +Eulen +Euler +Exile +Exils +Extra +Fabel +Faden +Fahne +Falke +Falle +Fango +Fangs +Farbe +Faruk +Fasan +Fatum +Fauna +Faust +Faxen +Fazit +Feder +Fehde +Fehlt +Feier +Feind +Felde +Felge +Felix +Fells +Ferne +Ferse +Feste +Fette +Feuer +Fiako +Fiber +Files +Filet +Filme +Films +Final +Finne +Finte +Firma +First +Fisch +Fjord +Flair +Flash +Fleck +Flohs +Flora +Fluge +Flugs +Fluor +Flurs +Fluss +Foens +Folgt +Folie +Foren +Forst +Forum +Fotos +Fouls +Foyer +Frack +Frage +Fragt +Franc +Frank +Freud +Frist +Frust +Fuder +Fuenf +Fugen +Fuhre +Funde +Funks +Furie +Fusel +Fusse +Gabun +Gagen +Galas +Galle +Ganze +Garbe +Garbo +Garne +Garns +Gasen +Gases +Gatte +Gauda +Gaudi +Geben +Geber +Gebet +Gehen +Geier +Geiss +Geist +Gelde +Genau +Genen +Genie +Genre +Genua +Georg +Gerte +Geste +Getue +Giant +Gicht +Gifte +Gilde +Girls +Gizeh +Glanz +Gleis +Glied +Gnade +Gnome +Goere +Golda +Golde +Golfs +Gorby +Gorki +Gosse +Gotts +Gouda +Grace +Gramm +Grams +Grate +Gratz +Graue +Greis +Grete +Griff +Grips +Gruft +Grund +Gucci +Guete +Guido +Gulag +Gummi +Gunst +Gurke +Gusto +Guten +Guter +Haars +Hades +Haelt +Hafen +Hafer +Hagel +Hagen +Hahns +Haien +Haifa +Haken +Halle +Hallo +Halme +Halms +Hanne +Hanoi +Hansa +Hansi +Harfe +Harns +Harro +Harte +Hasen +Haube +Hauch +Hauer +Hauff +Haupt +Hause +Hawai +Heber +Hedda +Heers +Hefts +Hegel +Heike +Heine +Heino +Heinz +Heiss +Helds +Helen +Helme +Helms +Hemds +Henne +Henry +Herde +Heros +Herrs +Hertz +Hesse +Heuss +Heute +Hexen +Hexer +Hilde +Hilfe +Hilft +Hinzu +Hippy +Hirne +Hirns +Hirse +Hitze +Hobel +Hochs +Hoehe +Hofes +Hoher +Holde +Homer +Honda +Horns +Hotel +Huber +Huene +Hufen +Huhns +Humus +Hunde +Husar +Husum +Hutes +Hymne +Ideen +Idiot +Idole +Idols +Idyll +Igeln +Igels +Ihnen +Ihrem +Ihren +Ihrer +Ikone +Image +Indem +Inder +Index +Indiz +Indus +Insel +Ionen +Irish +Isaac +Isaak +Islam +Jacht +Jacke +Jacob +Jaffa +Jahre +Jahrs +Jahwe +Jalta +James +Japan +Jause +Jedem +Jeden +Jeder +Jedes +Jemen +Jesus +Jetzt +Jogis +Joker +Jones +Josef +Jubel +Judas +Juden +Judos +Julia +Julis +Junge +Junis +Jupes +Juras +Jurys +KPdSU +Kaaba +Kabul +Kader +Kaese +Kaffs +Kafka +Kahns +Kairo +Kakao +Kalif +Kalks +Kalte +Kamin +Kamms +Kampf +Kanal +Kanne +Kanon +Kante +Kappe +Karat +Karin +Karos +Karre +Karte +Kasko +Kasse +Kasus +Kater +Katia +Kaufs +Kegel +Kehle +Keile +Keils +Keims +Keine +Kekse +Kelch +Kelle +Kenia +Kerbe +Kerle +Kerls +Kerne +Kerns +Kette +Keule +Khmer +Kiele +Kilos +Kings +Kinns +Kinos +Kiosk +Kitts +Klage +Klang +Klees +Kleie +Klein +Klett +Kleve +Klick +Klima +Kloss +Klotz +Klubs +Knabe +Knall +Knast +Knauf +Knaur +Knete +Knick +Kniee +Knien +Knies +Kniff +Knopf +Kobra +Kochs +Koeln +Kohle +Kohls +Kojen +Kokon +Kolik +Kombi +Komet +Komik +Komma +Kommt +Kongo +Konto +Kopfe +Kopie +Koran +Korea +Korns +Korso +Krach +Kraft +Kraut +Krebs +Kreis +Kreme +Kreml +Kreta +Kreuz +Krieg +Krimi +Krise +Krume +Kuala +Kubas +Kubus +Kuehe +Kugel +Kupee +Kupon +Kuppe +Kurde +Kurie +Kurse +Kurze +Kyoto +Label +Labor +Lachs +Lacke +Laden +Laerm +Lagen +Lager +Lampe +Lande +Lange +Lanka +Larve +Lasso +Latex +Lauch +Laufe +Laufs +Lauge +Laune +Leben +Lecks +Leere +Legen +Lehre +Leibe +Leibs +Leica +Leier +Leine +Leise +Lenin +Lenze +Leone +Lepra +Lesen +Leser +Lette +Leute +Liane +Licht +Lides +Liebe +Liegt +Lifts +Lilie +Lille +Lilly +Limit +Linie +Linke +Links +Linse +Lippe +Liste +Liter +Lloyd +Lobby +Lobes +Loess +Loewe +Logik +Logis +Lohnt +Loire +Lords +Loren +Lotte +Lotto +Lotus +Louis +Luchs +Luder +Luege +Lunas +Lunch +Lunge +Lunte +Luxus +Lyder +Lynch +Lyrik +MByte +MSDOS +Mache +Macke +Maden +Maeni +Maerz +Mafia +Magen +Magie +Magna +Mainz +Makel +Maler +Malta +Malus +Mamas +Mamba +Manie +Manko +Maori +Mappe +Marat +Marge +Marie +Markt +Marsa +Masel +Maske +Masse +Mater +Mauer +Maxim +Mazda +Mbyte +Meere +Meers +Mehls +Meier +Meile +Meint +Meise +Meist +Memel +Mensa +Menue +Meran +Merck +Messe +Meter +Meute +Midas +Mieke +Mikro +Milan +Milch +Miliz +Mimen +Mimik +Minis +Minne +Minni +Minus +Mixer +MoOet +Modem +Modul +Moege +Moewe +Mokka +Molen +Molle +Molly +Monat +Monde +Monte +Moral +Moron +Mosel +Moser +Moses +Motel +Motiv +Motor +Motte +Motus +Muehe +Muell +Muenz +Mulde +Multi +Mumie +Murks +Musik +Musse +Mutes +Mutti +Nabel +Nacht +Nadel +Naehe +Nagel +Nahen +Naive +Namur +Nasen +Nazis +Nebel +Neben +Neffe +Neger +Negev +Negro +Nehme +Nehru +Neige +Neons +Nepal +Nervs +Nerze +Nette +Netto +Netze +Neuen +Neues +Neuss +Nicht +Niele +Niere +Niete +Niger +Nikki +Nikko +Nikon +Nizza +Noete +Nonne +Notar +Noten +Notiz +Notre +Novum +Nudel +Nylon +ODECA +Oasis +Obers +Ochse +Odium +Oefen +Oesen +Oheim +Ohren +Ohres +Oktav +Olymp +Omaha +Omega +Opern +Opfer +Opium +Orden +Order +Orgel +Orgie +Orion +Orkan +Orten +Ortes +Oscar +Oskar +Osten +Otter +Ozean +PRINT +Paare +Pablo +Paket +Pakte +Pakts +Papas +Pappe +Paris +Parks +Parts +Party +Paste +Paten +Pauke +Pavia +Pechs +Pedal +Pedro +Pegel +Peggy +Pence +Pepsi +Perle +Perus +Peter +Petra +Petri +Petro +Pfade +Pfalz +Pfand +Pfaue +Pfaus +Pfeil +Pferd +Pflug +Pfote +Pfuhl +Phase +Phnom +Photo +Pille +Pilot +Pilze +Pinie +Piper +Pippi +Pirat +Piste +Pixel +Plato +Plaza +Pluto +Pneus +Pokal +Poker +Polin +Polis +Polit +Polle +Pomps +Ponte +Ponys +Poren +Porno +Porto +Posen +Power +Prado +Prags +Preis +Prosa +Prunk +Puder +Puett +Pulle +Pulli +Pulte +Pumps +Punkt +Puppe +Puten +Puzzi +Qualm +Quart +Queen +Quere +RSFSR +Rabat +Rache +Radau +Radio +Radon +Raete +Rahms +Rally +Rambo +Rampe +Rande +Rasse +Rasta +Raten +Rates +Ratte +Rauch +Raudi +Raume +Raums +Reale +Realo +Reben +Recht +Regal +Regel +Regen +Reger +Regie +Reihe +Reims +Reise +Rente +Reste +Rests +Rhode +Rhone +Ricke +Riege +Rinds +Rings +Rippe +Risse +Riten +Rival +Robbe +Robin +Roebi +Roehm +Roete +Roger +Rohre +Rolex +Rolle +Rolls +Roman +Rosen +Rotor +Royce +Rubik +Ruder +Rufen +Ruhms +Ruins +Rumpf +Runde +Russe +SEATO +SHELL +SWAPO +Saals +Saats +Sadat +Saele +Saeue +Safte +Safts +Sagen +Sagte +Saite +Salat +Saldo +Salem +Salon +Salto +Salut +Salve +Salze +Samen +Samts +Sande +Sands +Santa +Sanyo +Sargs +Satan +Satin +Satze +Sauce +Saudi +Sauna +Scala +Schaf +Schah +Schar +Schau +Schub +Schuh +Scout +Seele +Segen +Sehen +Seher +Seich +Seide +Seife +Seiko +Seils +Seims +Seins +Seite +Sekte +Sekts +Semit +Senat +Senfs +Seoul +Serbe +Seren +Serie +Serif +Sesam +Setzt +Sexes +Sexus +Shell +Shows +Sicht +Siegs +Siels +Sigma +Silbe +Simon +Sinai +Sinus +Sippe +Sirup +Sitte +Sitze +Skala +Skats +Skier +Slave +Slums +Snobs +Socke +Sodom +Sofas +Sofia +Sogar +Sohne +Sohns +Solde +Solds +Solon +Sonne +Sonst +Sorge +Sorte +Sosse +Sound +Sowie +Spalt +Spann +Spans +Spant +Spass +Speck +Speer +Spiel +Spion +Spore +Sporn +Sport +Spreu +Sprit +Spuks +Staat +Stabs +Stadt +Stahl +Stake +Stall +Stamm +Stand +Stare +Stars +Statt +Staub +Staus +Steak +Stege +Stegs +Steht +Steve +Stich +Stiel +Stier +Stift +Stile +Stils +Stirn +Stock +Stola +Stolz +Stopp +Story +Stoss +Stout +Stroh +Stube +Stuck +Stufe +Stunk +Sturm +Stuss +Stute +Suche +Sudan +Suite +Sumpf +Super +Suppe +Sushi +Swing +Syrer +TIMES +Tabak +Tadel +Tafel +Tages +Taiga +Takel +Takte +Takts +Taler +Tales +Talgs +Talks +Talon +Tands +Tange +Tango +Tangs +Tanks +Tante +Tapet +Taras +Tasse +Taste +Taten +Tatze +Taube +Taxen +Taxis +Teams +Teers +Teich +Teigs +Teile +Teils +Teint +Telex +Tempo +Tenne +Tenor +Terze +Tests +Texas +Theke +Thema +Therm +These +Tibet +Ticks +Tiere +Tiers +Times +Tinte +Tiran +Tirol +Titan +Titel +Tobak +Todes +Tokio +Tolle +Tones +Toren +Torfs +Torso +Totos +Tower +Trabi +Trakt +Trane +Trans +Traum +Treff +Trend +Treue +Trick +Trieb +Trios +Tritt +Troja +Trost +Trotz +Truck +Truhe +Trunk +Trust +Tuben +Tuell +Tuere +Tuete +Tuffs +Tulpe +Tumor +Tunis +Turbo +Turme +Turms +Tusch +Tutor +Typen +Typus +UNITA +UdSSR +Uebel +Ueber +Ufers +Uhren +Ulmen +Umweg +Umzug +Ungar +Union +Unken +Unmut +Unruh +Unser +Untat +Unter +Urans +Urins +Vater +Vatis +Vegas +Venen +Venus +Verdi +Verse +Vetos +Veuve +Video +Viele +Villa +Viola +Viper +Viren +Visum +Vokal +Volke +Volks +Volle +Vorab +Votum +WITCH +Waben +Wachs +Waffe +Wagen +Wahns +Wahre +Waise +Walde +Walen +Wales +Walls +Wange +Wanne +Wanst +Wanze +Waren +Warze +Watte +Watts +Weber +Wedel +Wegen +Wehen +Weibe +Weich +Weide +Weile +Weins +Weise +Weiss +Welpe +Wende +Werbe +Werft +Werks +Werte +Wesen +Weser +Weste +Whigs +Wicke +Wiege +Wieso +Wille +Willy +Winks +Wippe +Wirte +Wirth +Witwe +Witze +Wobei +Woche +Wohin +Wohle +Wolke +Wolle +Womit +Wonne +Woran +World +Worms +Worte +Worts +Wotan +Wovon +Wovor +Wucht +Wunde +Wurde +Wurms +Wurst +XENIX +XEROX +Xerox +Yacht +Zahle +Zahns +Zange +Zaren +Zarin +Zebra +Zeche +Zehen +Zeigt +Zeile +Zelle +Zelte +Zeuge +Zeugs +Zicke +Ziege +Zieht +Ziele +Zimts +Zinne +Zinns +Zinse +Zitat +Zitze +Zofen +Zorns +Zorro +Zoten +Zuber +Zucht +Zuges +Zumal +Zunft +Zunge +Zuppa +Zuruf +Zuzug +Zweig +Zwick +Zwirn +Zwist +Zyste +abgab +abkam +abtun +abzgl +abzog +achte +adeln +adelt +adieu +adlig +aefft +aetzt +affig +agile +ahnde +ahnen +ahnte +aktiv +akute +allen +aller +alles +allwo +almen +altem +alten +alter +altes +amigo +amour +amtet +anbei +ander +angab +angle +anhob +ankam +ansah +antat +antik +antut +anzog +apart +argen +arger +arges +arher +armem +armen +armes +assen +backe +baden +badet +bahre +ballt +banal +bange +bangt +banne +bannt +barer +barst +batet +bauen +baust +baute +beben +bebte +behob +beide +beige +belle +belog +besah +beste +beten +betet +beuge +beugt +bewog +bezog +biege +biegt +biete +bilde +binde +birgt +bisst +bitte +blass +blaue +bleib +blick +blieb +blies +blind +bloed +blond +blute +boeig +boese +boget +bogst +borge +borgt +botet +boxen +boxte +brate +brave +breit +bring +brown +buche +bucht +bumst +bunte +carte +chick +circa +class +comic +crack +dBase +daher +dahin +damit +dampf +dance +danke +dankt +daran +darum +daure +davon +dehne +dehnt +denen +denke +derbe +deren +derer +desto +deute +devot +dicht +diene +dient +doese +doest +doofe +drang +drauf +drein +dritt +droht +dubio +ducke +duckt +duenn +dufte +dumpf +durch +ebnen +echte +eckig +edlen +edler +edles +ehrst +ehrte +eifre +eigne +eilig +eilst +einen +einer +eines +einig +einst +eisig +eitel +elfte +empor +emsig +enden +endet +engem +engen +enger +enges +enorm +erbot +erbst +erbte +ergab +erlag +ernte +erzog +etwas +eurem +euren +eures +ewige +exakt +fache +facto +fadem +faden +fader +fades +fahle +fahre +fahrt +falbe +falls +falte +famos +fange +fasse +fasst +faste +fatal +faule +fegen +fegst +fegte +feige +feilt +feire +fesch +feure +fidel +fides +fiele +fielt +filmt +finde +fixen +fixer +fixte +flaue +flehe +fleht +flink +flitz +flohe +floss +flott +fluch +flugs +fluid +focht +foppe +foppt +forme +formt +frage +fragt +frass +frech +freie +fremd +freue +frohe +fromm +frueh +fuegt +fuers +funke +funkt +fuzzy +gaben +gaebe +gaert +gaffe +gafft +garni +geben +gegen +gehen +gehst +geile +geize +geizt +gelbe +gelle +gellt +gelte +genas +genau +genug +gerne +getan +gibst +ginge +glatt +glaub +glich +glitt +grabe +grabt +grase +grast +graue +grell +griff +gross +gruen +guckt +gutem +guter +gutes +haben +hacke +hackt +haelt +hafte +hager +hakte +halbe +hallt +hange +happy +harke +hasch +hasse +hasst +haste +hat's +hauen +haust +haute +heben +hebst +hefte +hegen +hegte +heile +heiss +heize +heizt +helfe +helft +helle +hello +hemmt +herab +heran +herbe +herum +herzu +hetzt +heuer +heule +heult +heute +hielt +hiess +hilft +hinab +hinan +hinge +hinkt +hinzu +hirte +hisst +hobet +hoble +hobst +hocke +hockt +hoert +hoffe +hofft +hohen +hohes +holen +holst +holte +human +hupen +hupst +hupte +huren +hurra +ideal +ihnen +ihren +ihrer +immun +impfe +impft +indes +inner +innig +intim +irren +irrer +irres +irrig +irrst +irrte +jagst +jagte +jedem +jeden +jeder +jedes +jenen +jener +jenes +jetzt +juble +juhee +juhei +kByte +kahle +kamst +kanns +karge +kaute +kegle +kehre +kehrt +keife +keift +keime +keimt +keine +keins +kenne +kennt +kerbe +kerbt +kesse +kicke +kille +killt +kippe +kippt +kitte +klage +klagt +klaue +klaut +klipp +kluge +knapp +knete +knien +koche +komme +kommt +koste +kraft +krame +krank +kraus +kriti +kroch +krumm +kuehl +kuren +kurvt +kurze +labil +labst +labte +lacht +ladet +laege +lagen +lagst +lange +lasen +lasst +laste +laude +lauem +lauer +lause +laust +laute +least +leben +lebst +lecke +leckt +ledig +leert +legal +leger +legte +lehne +lehnt +leide +leiht +leime +leimt +leite +lerne +lernt +liebe +liebt +liefe +lieft +liege +liegt +lieht +liess +liest +lifte +limes +loben +lobte +loche +locht +locke +lockt +loese +loest +logen +lokal +losen +loste +lotse +luden +luege +luegt +mache +macht +maehe +maeht +magst +mahlt +malst +malte +manch +mault +media +mehre +mehrt +meide +meine +meist +melde +melke +melkt +merci +merke +merkt +miese +miete +milde +minim +minnt +misse +misst +mixed +mixte +mobil +mogle +moste +motzt +muede +mueht +munde +mutig +naehe +naeht +nagen +nagst +nagte +nahen +nahes +nahmt +nahst +nahte +narrt +nebst +necke +neckt +nehmt +neigt +nenne +nennt +nervt +neuen +neuer +neues +nicht +nickt +niese +nippe +nippt +niste +noble +norme +nutzt +obern +obige +oblag +ocker +oeden +oeder +oelen +oelig +oelst +oelte +offen +opake +ordne +orten +packe +paffe +pafft +parke +passe +peilt +pfade +pfiff +piano +pisse +plage +plagt +plane +plant +platt +plump +pocht +polar +prall +preis +pries +prima +print +probt +prost +pumpe +pumpt +purem +puren +pures +puste +putze +quasi +quell +quick +raffe +rafft +ragst +ragte +ramme +rammt +rangt +rarem +rarer +rares +rasch +ratet +ratio +raubt +rauhe +raunt +recht +reckt +redet +reell +regem +regen +reges +regte +reibe +reibt +reife +reift +reiht +reime +reimt +reist +reite +remis +renne +rette +rieft +ringe +ringt +rinnt +ritte +ritze +ritzt +robbt +rocht +rohem +rohen +rohes +rollt +roste +rotem +roten +roter +rotzt +rouge +rufst +ruhen +ruhig +ruhst +ruhte +rupfe +rupft +saeen +saege +saegt +saehe +saest +saete +sag's +sagen +sahen +sahet +sahst +sanft +sankt +sauen +sauer +saufe +sauft +saure +sause +saust +schal +scheu +schob +schon +schub +schuf +schur +sechs +segel +segle +segne +sehen +sehne +sehnt +seife +seile +seine +selbe +sende +sengt +senil +senke +sexta +siebe +siebt +siech +siege +siehe +singe +singt +sinke +sinkt +sinnt +sitze +smart +sogar +sogen +sohle +solch +solid +solls +somit +sonor +sonst +sooft +sorgt +sowas +sowie +spare +spart +speie +speit +spiet +spott +spukt +stach +stank +starb +stark +statt +staue +stehe +stehn +steht +steif +steil +stete +still +stolz +stumm +sucht +sudle +suess +summa +surre +surrt +taete +tafle +tagst +tagte +takle +tanze +tanzt +tappe +tappt +tapse +tapst +tatet +tatst +tauen +taufe +tauft +tauge +taugt +taust +taute +teere +teert +teils +teilt +teuer +teure +texte +tilge +tilgt +tippe +tippt +tobte +toene +toent +tolle +tosen +toste +total +toten +toter +totes +trabe +traff +trage +trank +traue +traut +trink +trotz +trugt +tuend +tunke +tunkt +tupfe +turne +turnt +tut's +tuten +tutet +tutti +ueben +uebst +uebte +ulkig +ulkst +umher +umhin +umsah +umtun +umzog +unbar +unfei +ungut +unser +unten +unter +vagen +vager +vital +vorab +voran +vorig +vorne +wache +wacht +waegt +waere +wagst +wagte +walle +wallt +walze +walzt +wanke +wankt +warme +warnt +warte +waten +water +watet +weben +webte +wecke +weckt +weder +wedle +wegen +wehre +wehrt +wehte +weich +weils +weine +weint +weiss +weist +weite +welch +welkt +wenig +wenns +werbt +werde +werfe +wesen +wetze +wetzt +wicht +wider +widme +wiegt +wilde +wimme +winde +winkt +wippt +wir's +wirke +wirkt +wisse +wisst +wisst +wogst +woher +wohlt +wollt +womit +worin +worum +wrang +wuchs +wunde +wurde +wurme +wurmt +wusch +zahle +zahlt +zanke +zankt +zarte +zehrt +zeige +zeigt +zerrt +zeugt +ziehe +zielt +zieme +ziemt +ziere +ziert +zirpt +zivil +zogen +zoget +zogst +zotig +zucke +zuckt +zudem +zuege +zugab +zumal +zupfe +zupft +zusah +zwang +zweit +Achse +Adler +After +Ahorn +Alter +Angel +Anker +Apfel +Armee +Armel +Artzt +Asche +Asien +Atzen +Backe +Beere +Beruf +Besen +Beule +Biene +Birne +Blase +Blatt +Blitz +Block +Blume +Boden +Bogen +Bohne +Bombe +Brett +Brief +Brust +Buero +Bucht +Busch +Busen +Chlor +Dampf +Datum +Dauer +Decke +Dicke +Draht +Drama +Dunst +Ebene +Eiche +Eimer +Eisen +Engel +Erbse +Erdol +Ernte +Essen +Essig +Faden +Fahne +Fahrt +Falle +Farbe +Faser +Faust +Feder +Feige +Feile +Feind +Ferne +Ferse +Feuer +Fisch +Fleck +Fluss +Folge +Frage +Fremd +Fuchs +Gabel +Geist +Gnade +Griff +Grund +Gummi +Gurke +Haare +Hacke +Hafen +Hafer +Hagel +Haken +Haupt +Hebel +Heute +Hilfs +Hoehe +Hohle +Holle +Honig +Hotel +Hufte +Hugel +Hulse +Human +Insel +Jacke +Junge +Juwel +Kaese +Kabel +Kafig +Kamel +Kamin +Kampf +Kanal +Karte +Katze +Kegel +Kehle +Kerbe +Kerze +Kette +Keule +Klotz +Knopf +Kohle +Komet +Konig +Konto +Konus +Kraft +Krahe +Kreis +Kreuz +Krieg +Kuche +Kugel +Kunst +Kurve +Laden +Lager +Laken +Lampe +Lange +Laufe +Laune +Leber +Leder +Licht +Linie +Linse +Lippe +Loewe +Logik +Lunge +Macht +Magen +Makel +Markt +Mauer +Menge +Milch +Minze +Mobel +Monat +Motor +Muell +Muhle +Munze +Musik +Nabel +Nacht +Nadel +Nagel +Natur +Nebel +Neger +Niere +Notiz +Olive +Onkel +Organ +Ozean +Paket +Pedal +Penis +Pfahl +Pfeil +Pferd +Pflug +Photo +Preis +Prosa +Pumpe +Puppe +Quarz +Rache +Ranke +Rauch +Raufe +Recht +Regal +Regel +Regen +Reihe +Rinne +Ritus +Rolle +Rumpf +Saege +Saite +Salat +Samen +Saule +Schaf +Schal +Scham +Schub +Schuh +Seele +Segel +Sehne +Seide +Seife +Seite +Sense +Sesam +Silbe +Skala +Sklav +Socke +Sonne +Sorge +Spass +Speer +Spiel +Spule +Stadt +Stahl +Stamm +Staub +Stein +Stern +Stirn +Stoff +Stolz +Stoss +Stuck +Stuhl +Sturm +Sumpf +Suppe +Tabak +Tante +Tasse +Taube +Thema +Tiefe +Tiger +Tinte +Tisch +Trane +Traum +Trick +Tulpe +Ubung +Vater +Virus +Vogel +Vokal +Waage +Wachs +Waffe +Wagen +Warme +Watte +Welle +Woche +Wolke +Wolle +Wunde +Wurst +Wuste +Zange +Zelle +Ziege +Zinke +Zunge +Zweig +abend +atmen +bauen +beten +bevor +bitte +blind +bloed +blond +braun +breit +dafur +deise +dicht +durch +eilen +enden +ernst +essen +facts +fegen +flach +geben +gehen +genau +genug +glatt +gross +gruen +haben +heben +holen +horen +huten +immer +inner +jagen +jeden +jetzt +keuhl +keine +klein +knien +konen +kurze +lange +leben +lesen +linke +loben +lugen +mager +meist +muede +nackt +nahen +neben +nicht +platt +recht +reich +rufen +ruhig +sagen +sanft +sauer +schon +sechs +sehen +selbe +slank +solid +spaet +spitz +starr +steif +still +stumm +suess +toten +uebel +ueber +unten +unter +viele +warum +weben +wegen +wehen +weich +weise +weiss +wenig +Abbau +Abruf +Abzug +Achse +Addon +Adern +Adria +Akkus +Akten +Aktiv +Aktor +Allee +Alles +Amiga +Anbei +Anker +Anllo +Anruf +Anzug +Armen +Arten +Ascii +Atari +Atmen +Augen +Autor +Backe +Bande +Barke +Basar +Bauch +Baums +Becon +Beere +Beide +Beine +Beleg +Berge +Bernd +Beruf +Beton +Beute +Bevor +Bezug +Bibel +Bitte +Blase +Blatt +Blaue +Blech +Blick +BlosS +Blume +Boeck +Boden +Boewe +Bombe +Boote +Bosse +Boten +Boxen +Brand +Braue +Breit +Brote +Bruch +Brust +Buero +Buben +Busen +Busse +ConM4 +Conm4 +Creme +Dabei +Daher +Damen +Damit +Dampf +Danke +Darin +Datei +Daten +Datex +Datum +Dauer +Davon +Davor +Decke +Deren +Dicke +Diebe +Diese +Dinge +Diwan +Dolch +Donau +Dongl +Dorfe +Draht +Dreck +Druck +Duese +Dumme +Dunst +Durch +Durst +Ebene +Ecken +Ehren +Eimer +Einem +Einen +Einer +Eines +Einst +Eisen +Eliza +Epoxi +Eprom +Epson +Ernte +Erste +Etage +Faden +Fahne +Fahrt +Falle +Falte +Farbe +Faure +Feder +Fehlt +Feind +Felds +Fibel +Figur +Filme +Firma +Fisch +Flach +Floez +Fluid +Foehn +Folge +Folie +Forst +Fotos +Frack +Frage +Freie +Frist +Frueh +Fugen +Fuhre +Funke +FusSe +Gabel +Gaben +Gabun +Gange +Ganze +Gasen +Geben +Geber +Gebot +Gegen +Gehen +Geist +Genau +Gerne +Geste +Glanz +Glied +Greis +Griff +GrosS +Gruen +Grube +Grund +GrusS +Guete +Gummi +Gunst +Gutes +Haelt +Haare +Haben +Hafen +Halde +Halle +Hallo +Halme +Hamed +Hanke +Haube +Hauch +Haupt +Hause +Hebel +Heben +Hecke +Hefte +Helme +Herrn +Herst +Heute +Hilfe +Hilfs +Hinzu +Hitze +Hoehe +Hobel +Hocke +Hoden +Hoher +Honig +Hosen +Huebe +Hubes +Hupen +Ideen +Ihnen +Ihrem +Ihren +Ihrer +Ihres +Ikone +Immer +Innen +Insel +Irren +Jacke +Jahre +Jause +Jedem +Jeder +Jedes +Jetzt +Joerg +Joerg +Jubel +Juwel +KDnet +KEINE +Kabel +Kamin +Kampf +Kanal +Kante +Kappe +Karos +Karre +Karte +Kasse +Kater +Katze +Kbyte +Kdnet +Kegel +Kehle +Keine +Kerbe +Kerle +Kette +Keule +Kinex +Kinos +Kippe +Kiste +Klage +Klang +Klaps +Kleid +Klenk +Knabe +Knien +Knopf +Kohle +Konto +Koord +Kopie +Kraus +Kreis +Kreuz +Krieg +Krimi +Kuehn +Kufen +Kunde +Kunst +Kurve +LCA's +Laedt +Laerm +Lader +Lagen +Lampe +Lande +Lanze +Latte +Laufe +Laune +Leben +Leber +Leder +Leere +Lehle +Leine +Lenze +Lerne +Lesen +Letzt +Leute +Licht +Lider +Liebe +Liegt +Linie +Linkt +Lippe +Liste +Litze +Loewe +Lochs +Logik +Lueke +Luxus +MByte +MIPRO +MSDOS +Maerz +Macht +Magen +Magst +Makro +Maler +Manne +Marke +Markt +Marne +MasSe +Maske +Masse +Mbyte +Meere +Meigs +Meine +Meist +Mende +Menge +Menue +Menue +Merke +Messe +Miene +Miete +Mikro +Mipro +Mitte +Moden +Modul +Mokka +Monat +Morde +Muehe +Muffe +Munix +Musik +NAMUR +NICHT +Naehe +Nacht +Nadel +Nagel +Namen +Namur +Nasen +Natur +Nebel +Neben +Neffe +Neger +Nehmt +Neige +Netze +Neuem +Neuer +Neues +Nicht +Nimmt +Notar +Noten +Notiz +Nuten +Oelen +Obhut +Ochse +Ocram +Offen +Ohren +Oktan +Opfer +Orgie +Otmar +Ouput +Paare +Pacht +Paket +Palme +Panik +Papst +Pegel +Pelze +Pfade +Pfeil +Pferd +Pfiff +Pfund +Phono +Piezo +Piste +Pixel +Platz +Polen +Poren +Porno +Potis +Prinz +Puder +Pumpe +Punkt +Puppe +Quais +Quarz +Quere +Quirl +RS232 +RS422 +Rades +Rampe +Rande +Raten +Rauch +Raupe +Recht +Recke +Regen +Regie +Reihe +Reine +Reise +Reste +Riedl +Riese +Ringe +Risse +Rmtos +Rodel +Rohre +Rolle +Rufen +Rugby +Runde +SKK24 +SKK34 +SM124 +Saals +Sache +Salat +Saldo +Schal +Schau +Schub +Seele +Segen +Seide +Seife +Seile +Seins +Seite +Sende +Serie +Setze +Setzt +Sicht +Siehe +Silan +Sinne +Skala +Socke +Sohle +Somit +Sonne +Sonst +Sorge +Sorte +Sowie +SpasS +Spule +Stadt +Stamm +Statt +Staub +Stege +Steht +Stets +Stich +Stiel +Stift +Stirb +Stirn +Streb +Stufe +Stuhl +Sturz +Suche +Summe +Suppe +Szene +Tafel +Tagen +Tages +Takte +Tasse +Taten +Teich +Teile +Teils +Tetra +Texte +Thema +Thron +Thurn +Tiefe +Tinte +Tisch +Titel +Toene +Trafo +Traum +Treff +Trenn +Tritt +Troja +Trost +Trotz +Tuete +Turbo +Turck +Typen +Typus +Ueber +UdSSR +Ufern +Uhren +Umbau +Umweg +Unser +Unter +Uralt +VT100 +Valvo +Vasen +Vater +Vergl +Video +Viele +Visum +Volle +Waere +Waage +Wachs +Wagen +Walze +Wange +Warte +Warum +Watte +Wegen +Weges +Weile +Weine +WeisS +Weise +Weite +Welle +Werke +Werte +Wesen +Weste +Whitt +Wiese +Wieso +Wille +Willi +Winde +Wobei +Woche +Wolke +Womit +Wonne +Worte +Woyna +Wucht +Wunde +Xenix +Yampa +ZEILE +Zakel +Zange +Zeche +Zeigt +Zeile +Zelle +Zeter +Zeugs +Ziele +Ziels +Zilog +Zitat +Zudem +Zunge +Zuvor +Zwang +Zweck +Zwerg +abzog +adrig +ahmen +aktiv +akute +alice +allem +allen +alles +allzu +altem +alten +anbei +antik +armen +armer +armes +artig +atmen +atmet +bauen +baute +beben +behob +beide +bekam +beste +beuge +beugt +bevor +bezog +biegt +biete +birgt +bitte +blasS +blieb +bloed +blosS +boese +bohrt +boten +braun +breit +bunte +conm4 +dabei +daher +dahin +damit +danke +daran +darin +darum +davon +davor +deckt +deine +denen +denke +denkt +deren +derer +desto +deute +dicht +dicke +dient +diese +drauf +drehe +dreht +dritt +droht +duenn +dumme +durch +ebene +echte +edlem +egsam +eigen +eilig +einem +einen +einer +eines +einst +eisig +eklig +emsig +endet +engen +enger +engte +enorm +erden +ergab +erhob +erlag +ernst +erste +essen +etwas +eurem +ewige +exakt +exine +fahre +falle +fasSt +fasse +faxen +fehlt +feine +ferne +feste +fette +fiele +finde +fixen +flach +fleht +flugs +folge +folgt +formt +frage +fragt +frech +freie +fremd +fromm +frueh +fuege +fuegt +fuenf +fuers +fusSt +gaebe +ganze +geben +gegen +gehen +gehst +gehts +gelbe +genau +genug +gerne +getan +gibst +glatt +graue +grobe +grosS +gruen +guten +guter +gutes +haelt +haben +halbe +hallo +hallt +halte +harte +hasse +hatte +heben +heisS +helle +hellt +hemmt +herab +heran +herum +heuer +heule +heute +hielt +hilft +hinab +hinkt +hinzu +hoere +hoert +hockt +hoffe +hohem +hohen +hoher +hohes +hohle +holen +hurra +huste +ihnen +ihrem +ihren +ihrer +ihres +immer +indem +innen +innig +irrem +irren +jedem +jeden +jeder +jedes +jeher +jenem +jenen +jener +jenes +jetzt +junge +kBaud +kByte +kaeme +kalte +kamen +kamst +kauft +kdnet +kehrt +keine +kenne +kennt +klamm +klare +klaut +klebt +klein +knapp +kocht +komme +kommt +koste +kraft +krank +kraus +kroch +krumm +kuehl +kurze +laedt +lache +lacht +lagen +lange +lasse +laufe +leben +lebst +leere +leert +legen +legst +legte +lehne +lehnt +leise +leite +lerne +lesen +liebe +liebt +liege +liegt +liesS +linke +loest +loggt +lohnt +lokal +losem +luegt +mache +macht +mager +malen +marco +meine +meint +meist +merke +merkt +misSt +moege +muede +musSt +nackt +nahen +neben +nebst +nehme +nehmt +neigt +nennt +nette +netto +neuem +neuen +neuer +neues +nicht +nicke +nickt +nimmt +nutze +nutzt +oedet +oelig +obere +obige +offen +packe +packt +parat +pasSt +platt +pocht +polig +puren +quitt +ragen +rasch +rasen +raten +raubt +rauhe +recht +reckt +redet +reine +reise +reizt +renne +rennt +rings +rinnt +rohem +rollt +rosig +rotem +roten +roter +rufen +ruhen +ruhig +runde +sackt +sagen +sagst +sagte +sahen +sanft +saugt +schal +schob +schon +sechs +sehen +seien +selig +sende +senkt +setze +setzt +siehe +sieht +singt +sinke +sinkt +sitze +sitzt +sogar +solch +somit +sonst +sooft +sorgt +sowas +sowie +spaet +spart +spukt +starb +starr +statt +stehe +steht +steif +stets +stieg +stolz +stumm +suche +sucht +surrt +tanzt +teile +teils +teilt +teste +teuer +teure +tippt +toben +tolle +trete +treue +tritt +trotz +uebel +ueber +ueble +uebte +umher +umhin +unser +unter +uralt +vagen +vergl +viele +viert +volle +vorab +voran +vorne +waere +wacht +wagen +wahre +waren +warme +warnt +warst +warte +warum +watet +weder +wegen +wehen +wehte +weich +weisS +weise +weist +weite +welch +wende +wenig +werde +werfe +wiegt +wieso +wilde +winde +winkt +wirft +wirke +wirkt +wirst +wobei +woher +wohin +wohne +wohnt +wolle +wollt +womit +woran +wovon +wurde +xload +zahlt +zarte +zeige +zeigt +zerrt +zeugt +ziehe +zieht +ziele +ziemt +zucke +zuckt +zudem +zumal +zupfe +zuvor +zweit diff --git a/deutsch.txt b/deutsch.txt index 2fe14c5..fa8cda4 100644 --- a/deutsch.txt +++ b/deutsch.txt @@ -1964,7 +1964,6 @@ Anders Andersdenkende Andeutungen Andorra -Andr‚ Andraengen Andrang Andranges @@ -3486,7 +3485,6 @@ Atomwissenschaftler Atomzeitalter Atomzeitalters Atomzerstruemmerung -Attach‚ Attache Attacke Attacken @@ -9640,7 +9638,6 @@ Bypass Byte Byzantiner Bzw -C‚zanne C-Dur CA CAD @@ -9735,7 +9732,6 @@ Cents Cervantes Cervelatwurst Ceylon -Chƒteau Cha-Cha-Cha Cha-cha-cha Chaiselongue @@ -10111,7 +10107,6 @@ Concertino Concord Concorde Concurrent-CP/M-86 -Conf‚rencier Conferencier Container Contergan @@ -15272,7 +15267,6 @@ FT Fabel Fabeln Fabelpferd -Faberg‚ Fabian Fabrik Fabrikanlagen @@ -33106,7 +33100,6 @@ Kuwait Kybernetiker Kybernetikers Kyoto -L‚vi-Strauss LAN LDP LH @@ -44576,7 +44569,6 @@ Rezessionskurs Rezessionsmodell Rezessionsrisiko Rezessionswolken -Rh“netal Rhabarber Rhapsodie Rheinbund @@ -117801,7 +117793,6 @@ ovulationshemmenden oxidiert oympische ozeanographischer -pòange paar paaren paarmal diff --git a/src/client.cpp b/src/client.cpp index 4f9bd4b..90fa4d2 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -22,6 +22,9 @@ Client::Client(const std::string &addr, const int &port) { serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); inet_aton(addr.c_str(), &serverAddr.sin_addr); +} + +void Client::connectToServer() { int rc = connect(sock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); if (rc < 0) { perror("connect() failed"); @@ -29,25 +32,26 @@ Client::Client(const std::string &addr, const int &port) { } } -void Client::disconnect() { close(sock); } +void Client::disconnectFromServer() { close(sock); } uint16_t Client::sendMessage(const char *msg) { return send(sock, msg, strlen(msg) + 1, 0); } -void Client::receiveMessage() { +wordle_de::Message Client::receiveMessage() { int nbytesrecv = recv(sock, inputBuffer, INPUT_BUFFER_SIZE, 0); - + wordle_de::Message msg; if (nbytesrecv <= 0) { if (nbytesrecv == 0) { - disconnect(); - return; + disconnectFromServer(); + return msg; } else { perror("recv() failed"); } close(sock); - return; + return msg; } - receiveCallback(sock, inputBuffer); + msg.ParseFromString(inputBuffer); bzero(&inputBuffer, INPUT_BUFFER_SIZE); + return msg; } diff --git a/src/client.hpp b/src/client.hpp index 13052fd..7341061 100644 --- a/src/client.hpp +++ b/src/client.hpp @@ -1,6 +1,7 @@ #ifndef _CLIENT_HPP #define _CLIENT_HPP +#include "wordle-de.pb.h" #include <arpa/inet.h> #include <functional> #include <string> @@ -10,20 +11,19 @@ class Client { int sock; sockaddr_in serverAddr; char inputBuffer[INPUT_BUFFER_SIZE]; - - typedef std::function<void(uint16_t, char *)> receiveCallbackType; + typedef std::function<void(uint16_t fd, char *)> receiveCallbackType; public: Client(); - Client(const std::string &serverAddr, const int &port); - - void disconnect(); + Client(const std::string &, const int &); + void connectToServer(); + void disconnectFromServer(); uint16_t sendMessage(const char *); - void receiveMessage(); + wordle_de::Message receiveMessage(); - void onInput(receiveCallbackType cb); + // void onInput(receiveCallbackType cb) { receiveCallback = cb; } -private: - receiveCallbackType receiveCallback; + // private: + // receiveCallbackType receiveCallback; }; #endif // !_CLIENT_HPP diff --git a/src/client_main.cpp b/src/client_main.cpp index d4495c5..dd17be0 100644 --- a/src/client_main.cpp +++ b/src/client_main.cpp @@ -1,10 +1,17 @@ #include "client.hpp" #include "definitions.hpp" +#include "util.h" +#include "util.hpp" #include "wordle-de.pb.h" +#include <cstdio> #include <iostream> +#include <mutex> +#include <stdexcept> #include <string> +#include <thread> using namespace wordle_de; + std::string getUsernameFromInput() { std::string username; std::getline(std::cin, username); @@ -29,32 +36,164 @@ std::string getPasswordFromInput() { return password; } -int main() { - GOOGLE_PROTOBUF_VERIFY_VERSION; - std::cout << "Willkommen zu Wordle auf Deutsch!" << std::endl; - std::cout << "Bitte gib deinen Benutzernamen und Passwort ein:" << std::endl; - std::string username, password; - while (true) { +std::string getGuessFromInput() { + std::string guess; + std::getline(std::cin, guess); + if (guess.empty()) { + throw "empty guess is not allowed"; + } + if (guess.length() != WORD_LENGTH) { try { - std::cout << "Benutzername: "; - username = getUsernameFromInput(); - std::cout << "Passwort: "; - password = getPasswordFromInput(); - break; - } catch (const char *error) { - std::cout << "Error: " << error << std::endl; + auto errMsg = string_format("word has to be exactly %d characters long", + WORD_LENGTH); + throw errMsg; + } catch (std::runtime_error e) { + throw "word has not the right length"; } } + return guess; +} + +void received(uint16_t fd, char *inputBuffer) { + auto msg = wordle_de::Message(); + msg.ParseFromString(inputBuffer); + + switch (msg.msg_case()) { + case Message::kGuess: + std::cout << "Guess" << std::endl; + break; + case wordle_de::Message::kGameState: { + std::cout << "Received Game State" << std::endl; + auto gs = msg.gamestate(); + if (gs.newword()) { + std::cout << "There is a new word available, resetting game..." + << std::endl; + } + break; + } + default: + break; + } +} +enum State { + INPUT_LOGIN, + WF_LOGIN_ACK, + INPUT_GUESS, + WF_GUESS_ACK, + WF_NEW_WORD +}; +int main() { + GOOGLE_PROTOBUF_VERIFY_VERSION; // try to connect to server auto cl = Client(); std::cout << "Connected to server!" << std::endl; std::cout << "Logging in..." << std::endl; - auto msg = Message(); - auto login = new Login(); - login->set_username(username); - login->set_password(password); - msg.set_allocated_login(login); - cl.sendMessage(msg.SerializeAsString().c_str()); + // State machine + State state = INPUT_LOGIN; + std::string username; + while (true) { + switch (state) { + case INPUT_LOGIN: { + std::cout << "Willkommen zu Wordle auf Deutsch!" << std::endl; + std::cout << "Bitte gib deinen Benutzernamen und Passwort ein:" + << std::endl; + std::string password; + while (true) { + try { + std::cout << "Benutzername: "; + username = getUsernameFromInput(); + std::cout << "Passwort: "; + password = getPasswordFromInput(); + break; + } catch (const char *error) { + std::cout << "Error: " << error << std::endl; + } + } + auto msg = Message(); + auto login = new Login(); + login->set_username(username); + login->set_password(password); + msg.set_allocated_login(login); + cl.sendMessage(msg.SerializeAsString().c_str()); + state = WF_LOGIN_ACK; + break; + } + case WF_LOGIN_ACK: { + auto msg = cl.receiveMessage(); + if (msg.msg_case() == wordle_de::Message::kLoginAck) { + if (msg.loginack().loggedin()) { + std::cout << "Logged in as " << username << std::endl; + state = INPUT_GUESS; + break; + } else { + std::cout << "Login failed. Error: " << msg.loginack().error() + << std::endl; + state = INPUT_LOGIN; + break; + } + } else { + std::cout << "Received message unsuspected type." << std::endl; + } + state = INPUT_GUESS; + break; + } + case INPUT_GUESS: { + std::string guess; + while (true) { + try { + std::cout << "Bitte gib ein Wort ein" << std::endl; + guess = getGuessFromInput(); + break; + } catch (std::string error) { + std::cout << "Error: " << error << std::endl; + } + } + auto guessMsg = new wordle_de::Guess(); + guessMsg->set_guess(guess); + auto msg = wordle_de::Message(); + msg.set_allocated_guess(guessMsg); + cl.sendMessage(msg.SerializeAsString().c_str()); + state = WF_GUESS_ACK; + } + case WF_GUESS_ACK: { + auto msg = cl.receiveMessage(); + if (msg.msg_case() == wordle_de::Message::kGuessAck) { + auto result = msg.guessack().result(); + bool correct = true; + std::string resultOut; + for (const auto &c : result) { + switch (c) { + case wordle_de::GuessAck_matchType::GuessAck_matchType_NO_MATCH: + correct = false; + resultOut += "x"; + break; + case wordle_de::GuessAck_matchType::GuessAck_matchType_MATCH: + correct = false; + resultOut += "m"; + break; + case wordle_de::GuessAck_matchType::GuessAck_matchType_EXACT_MATCH: + resultOut += "M"; + break; + } + } + std::cout << resultOut << std::endl; + if (correct) { + std::cout + << "Du hast das Rätsel gelöst! Warte auf das nächste Wort..." + << std::endl; + state = WF_NEW_WORD; + } else { + std::cout << "Versuchs noch einmal!" << std::endl; + state = INPUT_GUESS; + } + } else { + std::cout << "Received message unsuspected type." << std::endl; + } + } + default: + break; + } + } } diff --git a/src/definitions.hpp b/src/definitions.hpp index 73fa3ac..9a1492e 100644 --- a/src/definitions.hpp +++ b/src/definitions.hpp @@ -9,5 +9,7 @@ const uint8_t MAX_GUESSES = 5; const uint16_t USERNAME_MAX_LENGTH = 100; const int DEFAULT_PORT = 40000; const char DEFAULT_IP[] = "127.0.0.1"; +const char DEFAULT_FILENAME[] = + "/Users/lukas/bht/03_NEP/wordle-de/deutsch-filtered.txt"; #endif // _DEFINITIONS_H diff --git a/src/game.cpp b/src/game.cpp index 40b8e07..b3ed5a9 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1,4 +1,12 @@ #include "game.hpp" +#include <algorithm> +#include <chrono> +#include <cstdlib> +#include <fstream> +#include <ios> +#include <iostream> +#include <mutex> +#include <thread> GameState::GameState() : word(), tries(0), guesses() {} @@ -21,3 +29,94 @@ GameState::guess(const std::string &guessedWord) { } return matchStatus; } + +std::string GameState::serialize(bool newWord) { + auto gs = new wordle_de::GameState(); + gs->set_newword(newWord); + gs->set_tries(tries); + auto msg = wordle_de::Message(); + msg.set_allocated_gamestate(gs); + return msg.SerializeAsString(); +} + +void Engine::createInstance() { + if (instance == nullptr) { + instance = new Engine(); + } +} + +void Engine::createInstance(const std::string &fileName) { + if (instance == nullptr) { + instance = new Engine(fileName); + } +} + +Engine *Engine::getInstance() { return instance; } + +void Engine::destroyInstance() { delete instance; } + +void Engine::setNewWord() { + if (!currentWord.empty()) { + pastWords.push_back(currentWord); + } + // read random line from file + std::ifstream file(wordFile); + if (file.is_open()) { + // find number of lines in file + file.unsetf(std::ios_base::skipws); + auto lines = std::count(std::istream_iterator<char>(file), + std::istream_iterator<char>(), '\n'); + file.setf(std::ios_base::skipws); + file.clear(); + file.seekg(0, std::ios::beg); + auto randLine = getRandomLine(lines); + for (int i = 0; i < randLine - 1; i++) + file.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); + std::string word; + file >> word; + file.close(); + setWord(word); + } + std::cout << "New Word: " << currentWord << std::endl; + std::cout << "Old words:" << std::endl; + for (const auto &w : pastWords) { + std::cout << w << std::endl; + } +} + +void Engine::setWord(const std::string &w) { + std::lock_guard<std::mutex> lock(mut); + currentWord = w; +} +std::string Engine::getWord() { + std::lock_guard<std::mutex> lock(mut); + return currentWord; +} + +void Engine::start(unsigned int interval) { + if (!started) { + std::thread([interval, this]() { + while (true) { + setNewWord(); + for (auto cb : callbacks) { + cb(currentWord); + } + std::this_thread::sleep_for(std::chrono::seconds(interval)); + } + }).detach(); + started = true; + } +} + +unsigned int Engine::getRandomLine(unsigned int max) { + srand(time(NULL)); + return rand() % max + 1; +} + +void Engine::registerNewWordCallback( + std::function<void(const std::string &)> cb) { + std::lock_guard<std::mutex> lock(mut); + callbacks.push_back(cb); +} + +Engine *Engine::instance; diff --git a/src/game.hpp b/src/game.hpp index f91bbb9..1ac90af 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -2,7 +2,10 @@ #define _STATE_H #include "definitions.hpp" +#include "wordle-de.pb.h" #include <array> +#include <functional> +#include <mutex> #include <string> #include <vector> @@ -25,5 +28,37 @@ public: GameState(const std::string &word); void setWord(const std::string &); guessResultT guess(const std::string &); + std::string serialize(bool); +}; + +class Engine { +public: + typedef std::function<void(const std::string &)> Callback; + +private: + std::string currentWord; + std::vector<std::string> pastWords; + std::string wordFile; + bool started = false; + std::mutex mut; + std::vector<Callback> callbacks; + +public: + static void createInstance(); + static void createInstance(const std::string &); + static Engine *getInstance(); + static void destroyInstance(); + + void start(unsigned int); + void setNewWord(); + void setWord(const std::string &); + std::string getWord(); + void registerNewWordCallback(Callback); + +private: + Engine() : wordFile(DEFAULT_FILENAME), mut() {} + Engine(const std::string &f) : wordFile(f) {} + unsigned int getRandomLine(unsigned int); + static Engine *instance; }; #endif // _STATE_H diff --git a/src/player.hpp b/src/player.hpp index ee05134..1b01190 100644 --- a/src/player.hpp +++ b/src/player.hpp @@ -11,7 +11,8 @@ class Player { GameState state; public: - Player(const std::string &name, const std::string &pw) : state() { + Player(const std::string &name, const std::string &pw) + : state(), username(name) { Botan::System_RNG rng; hashedPw = Botan::argon2_generate_pwhash(pw.c_str(), sizeof(pw.c_str()), @@ -25,6 +26,9 @@ public: guess(const std::string &guess) { return state.guess(guess); } + std::string getUsername() { return username; } + GameState getGameState() { return state; } + void setWord(const std::string &w) { state.setWord(w); } }; #endif diff --git a/src/server.cpp b/src/server.cpp index 9f0b3e2..2cfb17a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3,6 +3,17 @@ #include <definitions.hpp> #include <sys/socket.h> +void Server::createInstance() { + if (instance == nullptr) { + instance = new Server(DEFAULT_PORT); + } +} + +void Server::createInstance(const int &port) { + if (instance == nullptr) { + instance = new Server(port); + } +} Server::Server() { setup(DEFAULT_PORT); } Server::Server(const int &port) { setup(port); } @@ -137,3 +148,5 @@ uint16_t Server::sendMessage(int source_fd, char *messageBuffer) { uint16_t Server::sendMessage(int source_fd, const char *messageBuffer) { return send(source_fd, messageBuffer, strlen(messageBuffer), 0); } + +Server *Server::instance; diff --git a/src/server.hpp b/src/server.hpp index 28176f5..1e57c1c 100644 --- a/src/server.hpp +++ b/src/server.hpp @@ -1,6 +1,8 @@ #ifndef _SERVER_H #define _SERVER_H +#include "game.hpp" +#include "wordle-de.pb.h" #include <functional> #include <netinet/in.h> #include <unistd.h> @@ -14,12 +16,17 @@ public: typedef std::function<void(uint16_t)> newConnectionCallbackType; typedef std::function<void(uint16_t)> disconnectCallbackType; -public: +private: Server(); Server(const int &); - Server(const Server &) {} + Server(const Server &) = delete; virtual ~Server(); +public: + static void createInstance(); + static void createInstance(const int &); + static void destroyInstance() { delete instance; } + static Server *getInstance() { return instance; } void init(); void run(); void stop(); @@ -32,6 +39,37 @@ public: uint16_t sendMessage(int source_fd, const char *messageBuffer); uint16_t sendMessage(int source_fd, char *messageBuffer); + void sendLoginAck(uint16_t fd, bool success, const char *errorMsg = "") { + auto ack = new wordle_de::LoginAck(); + ack->set_loggedin(success); + ack->set_error(errorMsg); + auto msg = wordle_de::Message(); + msg.set_allocated_loginack(ack); + sendMessage(fd, msg.SerializeAsString().c_str()); + } + void sendGuessAck(uint16_t fd, const GameState::guessResultT &res) { + auto result = new wordle_de::GuessAck(); + for (const auto &r : res) { + switch (r) { + case GameState::NO_MATCH: + result->add_result( + wordle_de::GuessAck_matchType::GuessAck_matchType_NO_MATCH); + break; + case GameState::MATCH: + result->add_result( + wordle_de::GuessAck_matchType::GuessAck_matchType_MATCH); + break; + case GameState::EXACT_MATCH: + result->add_result( + wordle_de::GuessAck_matchType::GuessAck_matchType_EXACT_MATCH); + break; + } + } + auto msg = wordle_de::Message(); + msg.set_allocated_guessack(result); + sendMessage(fd, msg.SerializeAsString().c_str()); + } + private: // file descriptor sets fd_set masterfds; @@ -61,5 +99,8 @@ private: void startListen(); void handleNewConnection(); void recvInputFromExisting(int fd); + +private: + static Server *instance; }; #endif // !_SERVER_H diff --git a/src/server_main.cpp b/src/server_main.cpp index cdf0d8f..88703dd 100644 --- a/src/server_main.cpp +++ b/src/server_main.cpp @@ -2,6 +2,7 @@ #include "player.hpp" #include "server.hpp" #include <arpa/inet.h> +#include <functional> #include <iostream> #include <map> #include <netinet/ip.h> @@ -11,7 +12,9 @@ #include <unistd.h> #include <wordle-de.pb.h> -std::map<std::string, Player *> players; +Engine *eng; +Server *srv; +std::map<int, Player *> players; void connected(uint16_t fd) { std::cout << "Connected" << std::endl; } void disconnected(uint16_t fd) { std::cout << "Disconnected" << std::endl; } @@ -29,18 +32,27 @@ void received(uint16_t fd, char *buffer) { std::cout << "Username: " << username << ", Password: " << password << std::endl; // check if player is registered - if (players.contains(username)) { + if (players.contains(fd) && players.at(fd)->getUsername() == username) { std::cout << "player known" << std::endl; - auto player = players.at(username); + auto player = players.at(fd); // authenticate player if (player->authenticate(password)) { std::cout << "Player '" << username << "' authenticated" << std::endl; } else { std::cout << "wrong password" << std::endl; + srv->sendLoginAck(fd, false, "wrong password"); } } auto player = new Player(username, password); - players[username] = player; + player->setWord(eng->getWord()); + players[fd] = player; + srv->sendLoginAck(fd, true); + auto cb = [player, fd](const std::string &w) { + player->setWord(w); + auto msg = player->getGameState().serialize(true); + srv->sendMessage(fd, msg.c_str()); + }; + eng->registerNewWordCallback(cb); break; } case wordle_de::Message::kGuess: { @@ -49,46 +61,37 @@ void received(uint16_t fd, char *buffer) { } auto guess = msg.guess(); std::cout << "Received Guess: " << guess.guess() << std::endl; + auto player = players.at(fd); + srv->sendGuessAck(fd, player->guess(guess.guess())); break; } case wordle_de::Message::kGameState: break; - case wordle_de::Message::MSG_NOT_SET: + default: break; } } int main(void) { GOOGLE_PROTOBUF_VERIFY_VERSION; - auto srv = Server(); - srv.onConnect(connected); - srv.onDisconnect(disconnected); - srv.onInput(received); + + // initialize server + Server::createInstance(); + srv = Server::getInstance(); + srv->onConnect(connected); + srv->onDisconnect(disconnected); + srv->onInput(received); std::cout << "Run..." << std::endl; - srv.init(); + srv->init(); + + // initialize game engine + Engine::createInstance(); + eng = Engine::getInstance(); + eng->start(60); + + // run the server while (true) { - srv.run(); - } - std::string word = "Hello"; - std::string guess = "hello"; - auto s = GameState(); - s.setWord(word); - auto res = s.guess(guess); - printf("Word: %s\n", word.c_str()); - printf("Guess: %s\n", guess.c_str()); - for (const auto &r : res) { - switch (r) { - case GameState::NO_MATCH: - printf("X"); - break; - case GameState::MATCH: - printf("m"); - break; - case GameState::EXACT_MATCH: - printf("M"); - break; - } + srv->run(); } - printf("\n"); return 0; } diff --git a/src/util.hpp b/src/util.hpp new file mode 100644 index 0000000..2c5eb06 --- /dev/null +++ b/src/util.hpp @@ -0,0 +1,20 @@ +#ifndef _UTIL_HPP +#define _UTIL_HPP +#include <memory> +#include <stdexcept> +#include <string> + +template <typename... Args> +std::string string_format(const std::string &format, Args... args) { + int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + + 1; // Extra space for '\0' + if (size_s <= 0) { + throw std::runtime_error("Error during formatting."); + } + auto size = static_cast<size_t>(size_s); + std::unique_ptr<char[]> buf(new char[size]); + std::snprintf(buf.get(), size, format.c_str(), args...); + return std::string(buf.get(), + buf.get() + size - 1); // We don't want the '\0' inside +} +#endif // !_UTIL_HPP diff --git a/wordle-de.proto b/wordle-de.proto index d674b64..c90ada1 100644 --- a/wordle-de.proto +++ b/wordle-de.proto @@ -1,26 +1,47 @@ -syntax = "proto2"; +syntax = "proto3"; package wordle_de; message Login { - optional string username = 1; - optional string password = 2; + string username = 1; + string password = 2; +} + +message LoginAck { + bool loggedIn = 1; + optional string error = 2; } message Guess { - optional string guess = 1; + string guess = 1; +} + +message GuessAck { + enum matchType { + NO_MATCH = 0; + MATCH = 1; + EXACT_MATCH = 2; + } + repeated matchType Result = 1; } message GameState { - optional uint32 tries = 1; - repeated Guess guesses = 2; - optional bool newWord = 3; + uint32 tries = 1; + repeated Guess guesses = 2; + bool newWord = 3; +} + +message GameStateAck { + bool received = 1; } message Message { oneof msg { Login login = 2; - Guess guess = 3; - GameState gameState = 4; + LoginAck loginAck = 3; + Guess guess = 4; + GuessAck guessAck = 5; + GameState gameState = 6; + GameStateAck gameStateAck = 7; } } -- GitLab