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