// charge un fichier de diplo (il vaut mieux partir d'un graphe vide avant de charger un jeu de fichiers) func (g *DiploGraph) ReadDiploGraph(r *bufio.Reader, ascii bool, subjectIsTroll bool) error { line, err := r.ReadString('\n') // TODO : utiliser r.ReadLine() plutôt que r.ReadString('\n') for err == nil { tokens := strings.SplitN(line, ";", 6) if len(tokens) < 5 { fmt.Println("Ligne invalide") continue } sid := chrall.AtoId(tokens[0]) eIsTroll := false if tokens[1] == "T" { eIsTroll = true } eid := chrall.AtoId(tokens[2]) v := new(DiploVertice) sn := getOrCreateNode(g.Guilds, sid) sn.IsTroll = subjectIsTroll var en *DiploNode if eIsTroll { en = getOrCreateNode(g.Trolls, eid) en.IsTroll = true } else { en = getOrCreateNode(g.Guilds, eid) } v.Start = sn v.End = en sn.Starts = AddVertice(sn.Starts, v) en.Ends = AddVertice(en.Ends, v) v.Text = strings.Trim(tokens[3], " ") if ascii { v.Text = chrall.Iso88591ToUtf8(v.Text) } if tokens[4] == "ENNEMI" { v.Foe = true } g.Vertices[v.Key()] = v line, err = r.ReadString('\n') //~ if subjectIsTroll { // DEBUG de la diplo troll //~ fmt.Println(v.ColoredText()) //~ } } if err != io.EOF { fmt.Println("Erreur au parsage de la diplo :") fmt.Println(err) return err } return nil }
func GetFormValueAsId(hr *http.Request, name string) int { values := hr.Form[name] if len(values) > 0 { return chrall.AtoId(values[0]) } return 0 }
// Lit un fichier csv contenant, triés par nombre de kills de trolls, une ligne pour // chaque troll connu (voir troll.go). // Calcule les tableaux triés en fin de chargement func (m *TksManager) ReadTrollCsvFileIfNew() error { mutexLectures.Lock() defer mutexLectures.Unlock() filename := filepath.Join(m.cheminDonnées, "trollstats.csv") if m.lastTrollFileRead > 0 { fi, err := os.Stat(filename) if err != nil { return err } if !!fi.IsDir() { return errors.New("TksManager : Fichier de stats " + filename + " introuvable ou anormal") } if fi.ModTime().Unix() < m.lastTrollFileRead { //fmt.Println("TksManager : le fichier n'a pas changé") return nil } } f, err := os.Open(filename) if err != nil { return err } defer f.Close() m.NbTrolls = 0 r := bufio.NewReader(f) line, err := r.ReadString('\n') // notons qu'on ne supprime pas les anciennes stats avant, on remplace directement // Et au final on ne devrait pas souvent redimensionner la table for err == nil { tokens := strings.SplitN(line, ";", 13) if len(tokens) < 13 { fmt.Println("Ligne invalide") } else { tks := new(TrollInfos) trollId, _ := strconv.Atoi(tokens[0]) tks.NbKillsTrolls = chrall.AtoId(tokens[1]) tks.NbKillsMonstres = chrall.AtoId(tokens[2]) tks.ClassementKillsTrolls = chrall.AtoId(tokens[3]) tks.ClassementKillsMonstres = chrall.AtoId(tokens[4]) tks.ClassifChrall = strings.Trim(tokens[8], " \n") tks.Nom = tokens[9] tks.Race = race(tokens[10]) tks.Niveau = chrall.AtoId(tokens[11]) tks.IdGuilde = chrall.AtoId(strings.Trim(tokens[12], " \n")) tks.Num = trollId if trollId >= len(m.Trolls) { if trollId >= cap(m.Trolls) { newSlice := make([]*TrollInfos, ((trollId+1)*5/4)+100) copy(newSlice, m.Trolls) m.Trolls = newSlice } m.Trolls = m.Trolls[0 : trollId+1] } m.Trolls[trollId] = tks m.NbTrolls++ } line, err = r.ReadString('\n') } if err != io.EOF { fmt.Println("Erreur au parsage :") fmt.Println(err) return err } m.lastTrollFileRead = time.Now().Unix() fmt.Println("TksManager : Fichier des trolls lu") m.TrollsByKills = SortTrollInfos(m.Trolls, m.NbTrolls, func(troll *TrollInfos) int { return troll.NbKillsTrolls + troll.NbKillsMonstres }) // on remplit le classement par kill, que l'on ne connait pas avant classement := -1 nbKills := int(0) for i, t := range m.TrollsByKills { if t == nil { break } if t.NbKillsTrolls+t.NbKillsMonstres != nbKills { classement = i + 1 nbKills = t.NbKillsTrolls + t.NbKillsMonstres } t.ClassementKills = int(classement) } //~ fmt.Println("\nTrollsByKills :") //~ for i, t := range(m.TrollsByKills) { //~ fmt.Printf(" #%d %s NbKillsTrolls=%d NbKillsMonstres=%d tag : %s \n", i+1, t.Nom, t.NbKillsTrolls, t.NbKillsMonstres, t.ClassifChrall) //~ if i==40 { //~ break //~ } //~ } m.TrollsByKillsMonstres = SortTrollInfos(m.Trolls, m.NbTrolls, func(troll *TrollInfos) int { return troll.NbKillsMonstres }) m.TrollsByKillsTrolls = SortTrollInfos(m.Trolls, m.NbTrolls, func(troll *TrollInfos) int { return troll.NbKillsTrolls }) m.AtkByKillsTrolls = SortTrollInfos(m.Trolls, m.NbTrolls, func(troll *TrollInfos) int { if strings.Index(troll.ClassifChrall, "ATK") >= 0 { return troll.NbKillsTrolls } return 0 }) return nil }