Spamschutz

Mericon

Mitglied
Hallo gemeinde :)

ich habe ein kleines denkproblem und da ich bei google nichts passendes finde frag ich mal hier nach ein paar denk ansätzen.

ich schreibe seid einigerzeit an einem chatsystem, dabei habe ich die basis nun soweit das ich einen Spamschutz einbauen möchte aber möglichst ohne unzählige timer.

Erstmal zum aufbau:

ich arbeite mit dem xSocket und der server hat folgende (relevanten) klassen:

xSocketDataHandler:
Nimmt eingehende nachrichten an und versendet nachrichten

parseMsg:
bekommt die nachrichten des xSocketDataHandlers und verarbeitet die enthaltenen informationen

onlineUsers:
Beinhaltet die derzeit eingelogten nutzer und deren informationen (Nick, Rang, Raum etc) (pro nutzer existiert eine instanz und alle instanzen werden im vector users gespeichert)

channel:
Beinhaltet die Räume und deren attribute (Raumname, größe, usersOnline, abRang) (pro raum existiert eine instanz und alle instanzen werden im vector channels gespeichert)

adminCmd:
hier werden die zugelassenen aktionen für admins geschrieben


userCmd:
hier werden die zugelassenen aktionen für alle user geschrieben

bei jeder eingehenden nachricht hängt der server einen timestamp an.

so nun will ich zB das pro user 3 nachrichten pro 2 sekunden möglich sind mehr nicht. Wie mache ich das am besten ohne timer starten zu müssen oder pro nutzer 3 nachrichten im run halten zu müssen?
Wie sieht das ganze performans mäßig aus?

ich hoffe ihr könnt mir ein wenig weiterhelfen.

(Achja das ist nur ein lernprojekt nebenbei :))

schonmal danke für eure ideen
 

jgh

Top Contributor
gib doch dem User einen Slot mit, der temporär die Zeit für die letzten 3 Nachrichten speichert. Bevor er dann die nächste Nachricht sendet, wird überprüft ob dein gewünschtes Zeitfenster passt und dann sendet er, oder halt nicht.
 

Mericon

Mitglied
Nabend nocheinmal :)

habe es nun soweit das ich die genannten drei sekunden kontrollieren kann nur ich habe da ein problem ...

ich habe folgende 2 methoden geschrieben:

Java:
public void newTS(Timestamp times) {
        if (ts[2] == null) {
            ts[2] = times;
        } else if (ts[1] == null) {
            ts[1] = times;
        } else if (ts[0] == null) {
            ts[0] = times;
        } else {
            ts[2] = ts[1];
            ts[1] = ts[0];
            ts[0] = times;
        }
    }

    public boolean checkSpam() {
        if (ts[0] != null) {
            long t = ts[0].getTime() - ts[0].getTime();
            System.out.println(t);
        }
        return true;
    }

so nun dachte ich ich forme die timestamps in millisekunden um aber da der timestamp ja die millis ab dem 1.1.1970 aussagt wird der wert t immer größer. Wie gehe ich am besten weiter vor?

danke nochmal
 

Mericon

Mitglied
Hallo nochmal :)

hab das problem im groben gelöst bekommen:

Java:
public boolean checkSpam() {
        if (ts[0] != null) {
            long t = ts[0].getTime() - ts[2].getTime();
            if(t < 3000){
                return false;
            }
            System.out.println(t);
        }
        return true;
    }

wenn ihr verbesserungsvorschläge habt könnt ihr sie gerne posten :)
 

Oben