Funkcija isPostOk određuje da li treba ponoviti poruku.
Ukratko, ako poruka sadrži tekst "Ovu poruku je menjao <user>" i ako se <user> razlikuje od autora poruke, onda se poruka ponavlja.
Ako originalni autor promeni poruku u roku od 10 minuta, poruka neće biti ponovljena, što je dobro.
Ne znam šta se dešava ako moderator promeni poruku u roku od 10 minuta. Pretpostavljam da bi to bio problem za program, jer ako nije dodat tekst "Ovu poruku je menjao...", onda promena neće biti detektovana i poruka neće biti ponovljena.
Ovo bi moglo da se reši upoređivanjem izvorne poruke i poruke na sajtu, s tim da bi trebalo i sa sajta učitati originalnu poruku (koja umesto html tagova sadrži bb kodove) ili pre poređenja stripovati sve tagove...
Detaljnije:
Code:
func isPostOk(c *http.Client, postId string, allowedUser string) (bool, error) {
post, err := getPost(c, postId)
if err != nil {
return false, err
}
if post == nil {
return false, nil
}
//proveri da li je post menjao neko drugi
for _, node := range htmlquery.Find(post, "./sub/b/text()") {
sub := htmlquery.InnerText(node)
r := regexp.MustCompile("^Ovu poruku je menjao (?P<user>.+) dana")
m := r.FindStringSubmatch(sub)
if m != nil {
i := r.SubexpIndex("user")
changedBy := m[i]
if changedBy != allowedUser {
return false, nil
}
}
}
return true, nil
}
Prvo pozivom getPost se pokušava učitavanje poruke. Ako getPost vrati nil, to znači da je poruka izbrisana i funkcija vraća false, što znači da će poruka biti ponovljena.
Code:
post, err := getPost(c, postId)
Ako je poruka učitana, onda se koristi XPath kako bi se napravio niz elemenata sa tekstom obuhvaćenim <sub><b>...</sub></b>
Code:
for _, node := range htmlquery.Find(post, "./sub/b/text()") {
Za svaki nađeni tekst pokreće se regularni izraz koji izvlači korisnika koji je promenio tekst.
Code:
r := regexp.MustCompile("^Ovu poruku je menjao (?P<user>.+) dana")
Ako se dobijeni korisnik razlikuje od originalnog autora, to znači da post nije ok i da ga treba ponoviti
Code:
if changedBy != allowedUser ...