feat(ebooks): Add tvl-ebooks code
Change-Id: If519e789a91fbf427373daa383c6ae00ba5e0b6c Reviewed-on: https://cl.tvl.fyi/c/depot/+/2007 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
This commit is contained in:
parent
cf878224ab
commit
a8508373ee
8 changed files with 687 additions and 0 deletions
174
fun/tvl-ebooks/parse-logs/main.go
Normal file
174
fun/tvl-ebooks/parse-logs/main.go
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
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)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue