Beispiel #1
0
    def try_login(self, client, content):
        """
        Einen KOCHA-Client am KOCHA-Server anmelden.

        Args:
            client: Die Daten der Clientverbindung.
            content: Der Inhalt der Nachricht.
        """
        command, alias, *_ = content.split()
        content = ""
        if command == "/login":
            if (not set(": ").issubset(alias)
                    and alias not in self.clients.values()
                    and alias != shared.KOCHA_SERVER_ALIAS):
                self.clients[client] = alias
                content = self.KOCHA_WELCOME_MESSAGE.format(alias)

        # Neuem Nutzer eine Nachricht senden (Willkommensnachricht bei
        # erfolgreicher Anmeldung, sonst einen leeren String)
        response = shared.KochaMessage(content=content,
                                       sender=shared.KOCHA_SERVER_ALIAS,
                                       is_dm=True)
        client.send(response)

        # Die anderen Clients darueber informieren, dass ein neuer
        # Nutzer sich erfolgreich am Chat angemeldet hat
        if content != "":
            message = shared.KochaMessage(
                content="{} joined the chat.".format(alias),
                sender=shared.KOCHA_SERVER_ALIAS)
            self.on_broadcast(client, message)
Beispiel #2
0
 def on_help(self, client):
     """
     Dem anfragenden Client eine Ueberischt aller Befehle schicken.
     """
     response = shared.KochaMessage(content=self.KOCHA_HELP_CONTENT,
                                    sender=shared.KOCHA_SERVER_ALIAS)
     client.send(response)
Beispiel #3
0
    def try_login(self, alias):
        """
        Versuchen den Client mit einem Alias Am KOCHA-Server anzumelden.

        Args:
            alias: Der Alias fuer die Anmeldung.
        Returns:
            Die Antwort des KOCHA-Servers
        """
        answer = None

        # Wenn nicht mit dem KOCHA-Server verbunden, nix machen
        if self.is_connected:

            # Loginanfrage an den KOCHA-Server senden
            request = shared.KochaMessage(content="/login " + alias)
            data = shared.JsonUtils.to_json(request)
            self.socket.sendall(data.encode())

            # Auf Antwort des KOCHA-Servers warten (maximal 5 Versuche)
            count = 0
            while answer is None and count < 5:
                try:
                    answer = self.receive()
                except socket.timeout:
                    pass

                count += 1

            # Wenn die Anmeldung erfolgreich war den Alias setzen
            if answer is not None:
                if answer.content != "":
                    self.alias = alias

        return answer
Beispiel #4
0
    def loop(self):
        """
        Wartet auf Nutzereingaben und verarbeitet diese in einer
        Endlosschleife.
        """
        while not self.stop:
            # Auf Nutzereingabe warten und diese verarbeiten
            c = self.input_window.getch()

            if c == ord("\n"):
                # Zeilenende ohne sonstige Eingabe ignorieren
                if self.input == "":
                    continue

                # Bei /q oder /quit Programm beenden
                if self.input.lower() in { "/q", "/quit" }:
                    self.stop = True

                # Ein Message-Object erstellen
                message = shared.KochaMessage(
                    content=self.input,
                    sender=self.kocha_tcp_client.alias)

                # Nachricht zum Nachrichtenpuffer hinzufuegen
                self.messages.append(message)

                # Eingabepuffer zuruecksetzen
                self.input = ""

                # Nachrichtenfenster und Eingabefenster neu zeichnen
                self.draw_messages_window()
                self.draw_input_window()

                # Message an den KOCHA-Server uerbermitteln
                self.kocha_tcp_client.send(message)

            elif c == curses.KEY_BACKSPACE or c == 127:
                # Bei Ruecktaste zuvor eingegebenes Zeichen entfernen
                self.input = self.input[:-1]

                # Eingabefenster neu zeichnen
                self.draw_input_window()

            elif c == curses.KEY_RESIZE:
                # Groesse des Interface an die neue Groesse des
                # Terminals anpassen
                self.resize()

            elif 31 < c and c <= 126:
                # Druckbare ASCII-Zeichen anhaengen
                self.input += chr(c)

                # Eingabefenster neu zeichnen
                self.draw_input_window()

            # Ansicht aktualisieren
            self.refresh()

        # KOCHA-Client am Server abmelden und UI schließen
        self.close()
Beispiel #5
0
    def on_members(self, client):
        """
        Dem anfragenden Client eine durch Kommata getrennte Liste aller
        am KOCHA-Server angemeldeten Clients liefern.

        Args:
            client: Die Daten der Clientverbindung.
        """
        response = shared.KochaMessage(content=", ".join(
            self.clients.values()),
                                       sender=shared.KOCHA_SERVER_ALIAS)
        client.send(response)
Beispiel #6
0
    def on_quit(self, client):
        """
        Den Client am KOCHA-Server abmelden.
        """
        # Die Clientverbindung schließen
        client.close()

        print("Closed connection of {!r}".format(client.address))

        # Andere Nutzer informieren, dass dieser Nutzer den Chat
        # verlassen hat
        message = shared.KochaMessage(content="{} left the chat.".format(
            self.clients[client]),
                                      sender=shared.KOCHA_SERVER_ALIAS)
        self.on_broadcast(client, message)

        # Den Client aus der Liste der angemeldenten Clients entfernen
        del self.clients[client]