Change-Id: If519e789a91fbf427373daa383c6ae00ba5e0b6c Reviewed-on: https://cl.tvl.fyi/c/depot/+/2007 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"bufio"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"math/rand"
 | |
| 	"os"
 | |
| 	"regexp"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/go-redis/redis"
 | |
| )
 | |
| 
 | |
| type incomingIRC struct {
 | |
| 	Command string   `json:"Command"`
 | |
| 	Host    string   `json:"Host"`
 | |
| 	Name    string   `json:"Name"`
 | |
| 	Params  []string `json:"Params"`
 | |
| 	User    string   `json:"User"`
 | |
| }
 | |
| 
 | |
| var quicklogMatch = regexp.MustCompile(`<(\w+)> (.+)`)
 | |
| 
 | |
| func main() {
 | |
| 	redisc := redis.NewClient(&redis.Options{
 | |
| 		Addr:     fmt.Sprintf("127.0.0.1:%d", 6379),
 | |
| 		Password: "", // no password set
 | |
| 		DB:       0,  // use default DB
 | |
| 	})
 | |
| 
 | |
| 	fireaway := make(chan incomingIRC, 10)
 | |
| 	go func() {
 | |
| 		f, err := os.Open("tvl.txt")
 | |
| 		if err != nil {
 | |
| 			log.Printf("aaa %v", err)
 | |
| 			os.Exit(0)
 | |
| 		}
 | |
| 
 | |
| 		bio := bufio.NewReader(f)
 | |
| 		for {
 | |
| 			line, _, err := bio.ReadLine()
 | |
| 			if err != nil {
 | |
| 				break
 | |
| 			}
 | |
| 
 | |
| 			sline := string(line)
 | |
| 
 | |
| 			offset := strings.Index(sline, "]")
 | |
| 
 | |
| 			notime := sline[offset+1:]
 | |
| 
 | |
| 			if quicklogMatch.MatchString(notime) {
 | |
| 				bits := quicklogMatch.FindAllStringSubmatch(notime, -1)
 | |
| 				if len(bits) != 0 {
 | |
| 					if len(bits[0]) != 0 {
 | |
| 						a := make([]string, 2)
 | |
| 						a[1] = bits[0][2]
 | |
| 						ic := incomingIRC{
 | |
| 							Name:   bits[0][1],
 | |
| 							Params: a,
 | |
| 						}
 | |
| 						log.Printf("aa %#v", ic)
 | |
| 
 | |
| 						fireaway <- ic
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}()
 | |
| 
 | |
| 	for msg := range fireaway {
 | |
| 		// Learn
 | |
| 		learnFromMessage(msg, redisc)
 | |
| 		// os.Exit(0)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func generateMesasge(msg incomingIRC, redisc *redis.Client) string {
 | |
| 	text := msg.Params[1]
 | |
| 	username := msg.Name
 | |
| 
 | |
| 	text = strings.ToLower(text)
 | |
| 	text = strings.Replace(text, ",", "", -1)
 | |
| 	text = strings.Replace(text, ",", "", -1)
 | |
| 	text = strings.Replace(text, ".", "", -1)
 | |
| 	text = strings.Replace(text, "!", "", -1)
 | |
| 	text = strings.Replace(text, "?", "", -1)
 | |
| 
 | |
| 	words := strings.Split(text, " ")
 | |
| 	lastWord := propwords(username, words[0], redisc)
 | |
| 	outputMsg := words[0] + " " + lastWord + " "
 | |
| 
 | |
| 	for {
 | |
| 		lastWord = propwords(username, words[0], redisc)
 | |
| 		if lastWord == "" || lastWord == "_END_" {
 | |
| 			return outputMsg
 | |
| 		}
 | |
| 
 | |
| 		outputMsg += lastWord + " "
 | |
| 		if len(outputMsg) > 100 {
 | |
| 			return outputMsg
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func propwords(username string, start string, redisc *redis.Client) string {
 | |
| 	userHash := redisc.HGetAll(fmt.Sprintf("%s-%s", username, start))
 | |
| 	userHashMap, err := userHash.Result()
 | |
| 	if err != nil {
 | |
| 		genericHash := redisc.HGetAll(fmt.Sprintf("generic-%s", start))
 | |
| 		userHashMap, err = genericHash.Result()
 | |
| 	}
 | |
| 
 | |
| 	userIntHashMap, totalVectors := stringMaptoIntMap(userHashMap)
 | |
| 	targetRand := rand.Intn(totalVectors)
 | |
| 	progresRand := 0
 | |
| 
 | |
| 	for k, v := range userIntHashMap {
 | |
| 		progresRand += v
 | |
| 		if targetRand > progresRand {
 | |
| 			return k
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	for k, _ := range userIntHashMap {
 | |
| 		return k
 | |
| 	}
 | |
| 
 | |
| 	return ""
 | |
| }
 | |
| 
 | |
| func stringMaptoIntMap(in map[string]string) (outMap map[string]int, total int) {
 | |
| 	outMap = make(map[string]int)
 | |
| 
 | |
| 	for k, v := range in {
 | |
| 		i, err := strconv.ParseInt(v, 10, 64)
 | |
| 		if err != nil {
 | |
| 			continue
 | |
| 		}
 | |
| 		total += int(i)
 | |
| 		outMap[k] = int(i)
 | |
| 	}
 | |
| 
 | |
| 	return outMap, total
 | |
| }
 | |
| 
 | |
| func learnFromMessage(msg incomingIRC, redisc *redis.Client) {
 | |
| 	text := msg.Params[1]
 | |
| 
 | |
| 	text = strings.ToLower(text)
 | |
| 	text = strings.Replace(text, ",", "", -1)
 | |
| 	text = strings.Replace(text, ",", "", -1)
 | |
| 	text = strings.Replace(text, ".", "", -1)
 | |
| 	text = strings.Replace(text, "!", "", -1)
 | |
| 	text = strings.Replace(text, "?", "", -1)
 | |
| 
 | |
| 	words := strings.Split(text, " ")
 | |
| 	username := msg.Name
 | |
| 
 | |
| 	for k, word := range words {
 | |
| 		// HINCRBY myhash field 1
 | |
| 		nextWord := "_END_"
 | |
| 		if len(words)-1 != k {
 | |
| 			nextWord = words[k+1]
 | |
| 		}
 | |
| 
 | |
| 		redisc.HIncrBy(fmt.Sprintf("%s-%s", username, word), nextWord, 1)
 | |
| 		redisc.HIncrBy(fmt.Sprintf("generic-%s", word), nextWord, 1)
 | |
| 	}
 | |
| }
 |