From f37e55173a6ad762603a010a607d6493e8520d36 Mon Sep 17 00:00:00 2001 From: Horscchtey Date: Sun, 14 Nov 2021 22:07:02 +0000 Subject: [PATCH] add stuff --- boddle.db | Bin 180224 -> 225280 bytes boddle.go | 116 +++++++++++++++++++++++++++++++++++++---------------- bot.go | 2 +- logging.go | 6 +-- 4 files changed, 83 insertions(+), 41 deletions(-) diff --git a/boddle.db b/boddle.db index 3a7dc7a672a8ed10ae90f2f81a1c2182679e4c7a..23d8f990b8d3b9c787325bfe142c6900f50fd99a 100644 GIT binary patch delta 34374 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

LD$J5zz!Sq>15$$hYk94 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 delta 258 zcmZp8z}wKkJwaOVAOiz~4g&)4Ow=)!KFFY_6Tr)x#lX%j#=t*~--Yin&tcy0-0!%> zHU|pK;o2<59nQqqJF&5I^LO40ijquRtjv;(#rZ`gsYRSzEX?9eNkxg7dE5+>ALz?7 zdTugc5#W&I&jHz@GnvQ1XtSb%A%Ane|Mq-;#z_q<3=E6{+gUF#o?&E+pMK#YW7u|$ zON{1Byj-0!Yz$0{j10^ZSa`SRTw$Csn}dn}BLn|W{*T)Q3z%;3PYmFl{;{4(ScHSW zg@OMQ|6~4Z{3rOg@-O9|!r!u4Q6YzadrLo4g8*|OSL$^31x$}OHdb?PPhG_{TND6Z C*hvcj diff --git a/boddle.go b/boddle.go index 3f2f6f9..38e3b62 100644 --- a/boddle.go +++ b/boddle.go @@ -16,11 +16,12 @@ type cmd struct { valid bool add bool cmd string - groups []int + groups []string suffix string + error string } -var begin_char = []byte{'<'} +var begin_char = []byte{'-', '<'} var db *sql.DB var err error @@ -39,7 +40,19 @@ func in (a byte, arr []byte) bool { return false } -func unique(intSlice []int) []int { +func unique_str(stringSlice []string) []string { + keys := make(map[string]bool) + list := []string{} + for _, entry := range stringSlice { + if _, value := keys[entry]; !value { + keys[entry] = true + list = append(list, entry) + } + } + return list +} + +func unique_int(intSlice []int) []int { keys := make(map[int]bool) list := []int{} for _, entry := range intSlice { @@ -51,11 +64,26 @@ func unique(intSlice []int) []int { return list } +/* +func unique[T any](tSlice []T) []T { + keys := make(map[T]bool) + list := []T{} + for _, entry := range tSlice { + if _, value := keys[entry]; !value { + keys[entry] = true + list = append(list, entry) + } + } + return list +} +*/ + // function to split advise message correctly -func filter(msg string) cmd { +func filter(msg string, foo bot) cmd { var c cmd if len(msg) <= 0 { + c.error = "Message is too short." c.valid = false return c } @@ -71,33 +99,41 @@ func filter(msg string) cmd { } if (strings.Contains(msg, "[") && strings.Contains(msg, "]")) { - re, _ := regexp.Compile(`\s*(\w*)\s*\[(.*)\]\s*(.*)\s*`) + re, _ := regexp.Compile(`\s*(\w*)\s*\[(.+)\]\s*(.*)\s*`) res := re.FindStringSubmatch(msg) if len(res) < 4 { + c.error = "You entered weird stuff, please try again." return c } c.cmd = res[1] if c.cmd == "" { LOG_WARN.Printf("empty cmd\n") + c.error = "The command was empty. A non-empty command is needed." return c } - // TODO: substitute group names with ids + // substitute group names with ids groups := strings.Fields(res[2]) - for _, i := range groups { - task := fmt.Sprintf("select id from groups where name = '%s'", i) + stmt, err := db.Prepare("select id from groups where name = ?") + checkErr(err) - row, err := db.Query(task) + for _, group := range groups { + rows, err := stmt.Query(group) if err != nil { - LOG_WARN.Printf("no such column: %s\n", i) + LOG_WARN.Printf("invalid query.") return c } group_id := 0 - if row.Next() { row.Scan(&group_id) } - row.Close() - if (group_id != 0) { - c.groups = append(c.groups, group_id) + if rows.Next() { + rows.Scan(&group_id) + c.groups = append(c.groups, fmt.Sprintf("%d", group_id)) + rows.Close() + } else { + c.valid = false + c.error = "Group name " + group + " is invalid." + rows.Close() + return c } } c.suffix = res[3] @@ -107,10 +143,12 @@ func filter(msg string) cmd { re, _ := regexp.Compile(`\s*(\w*)\s*(.*)\s*`) res := re.FindStringSubmatch(msg) if len(res) < 3 { + c.error = "You entered weird stuff, please try again." return c } c.cmd = res[1] if c.cmd == "" { + c.error = "The command was empty. A non-empty command is needed." return c } @@ -127,23 +165,12 @@ func getRandomEntry(c cmd) string { // TODO: increment counter // if database entry exists: set tag / group and run query task := "select distinct l.content from line l, brain b, tag t" + task += " where l.id = b.line_id and t.id = b.tag_id and t.id = " + c.cmd if len(c.groups) > 0 { - task = fmt.Sprintf("%s, groups g", task) + task += " and l.id in (select line_id from brain where group_id = " + strings.Join(c.groups," intersect select line_id from brain where group_id = ") + ")" } - task = fmt.Sprintf("%s where l.id = b.line_id and t.id = b.tag_id", task) - task = fmt.Sprintf("%s and t.id = %s", task, c.cmd) - if len(c.groups) > 0 { - task = fmt.Sprintf("%s and g.id = b.group_id and (", task) - for i, group := range c.groups { - task = fmt.Sprintf("%sg.id = %d", task, group) - if i < (len(c.groups) - 1) { - task = fmt.Sprintf("%s or ", task) - } else { - task = fmt.Sprintf("%s)", task) - } - } - } - return fmt.Sprintf("%s ORDER BY RANDOM() LIMIT 1", task) + task += " ORDER BY RANDOM() LIMIT 1" + return task } // line: @@ -158,9 +185,12 @@ func parsemsg(msg irc_msg, foo bot) bool { } msg.msg = msg.msg[1:] - c := filter(msg.msg) + c := filter(msg.msg, foo) if !c.valid { LOG_WARN.Printf("non valid input found.\n") + if c.error != "" { + sendmsg(foo.conn, msg.channel, "Falscher input du SP-Ersti... " + c.error) + } return false } if c.cmd == "" { @@ -183,28 +213,44 @@ func parsemsg(msg irc_msg, foo bot) bool { sorter_row.Scan(&sorter_id, &tag_id, &groups_allow, &name_allow, &has_groups) if groups_allow != 0 { - // warning: not allowed - c.groups = nil // use c.groups[:0] to keep allocated space + sendmsg(foo.conn, msg.channel, "This command does not allow groups. :(") + return false } if name_allow != 0 && !c.add { // warning: not allowed + sendmsg(foo.conn, msg.channel, "This command ignores provided names. :(") c.suffix = "" } c.cmd = tag_id + var sorter_groups []string if has_groups == 0 { sorter_groups_row, err := db.Query(fmt.Sprintf("select group_id from sorter_groups where sorter_id = '%s'", sorter_id)) checkErr(err) if sorter_groups_row.Next() { var group_id int sorter_groups_row.Scan(&group_id) - c.groups = append(c.groups, group_id) + if c.add { + sorter_groups = append(sorter_groups, fmt.Sprintf("%d", group_id)) + } else { + c.groups = append(c.groups, fmt.Sprintf("%d", group_id)) + } } sorter_groups_row.Close() } - c.groups = unique(c.groups) sorter_row.Close() + if c.add { + var tag_name string + tag_name_row, err := db.Query(fmt.Sprintf("select name from tag where id = %d", tag_id)) + checkErr(err) + if tag_name_row.Next() { + tag_name_row.Scan(&tag_name) + } + tag_name_row.Close() + sendmsg(foo.conn, msg.channel, "You're using an alias. Please try again with 'add" + tag_name + " [" + strings.Join(sorter_groups, " ") + "]. Thanks!") + return false + } } else { LOG_WARN.Printf("no sorter entry, no translation possible\n") sendmsg(foo.conn, msg.channel, "No entry found, sorry...") @@ -258,7 +304,7 @@ func parsemsg(msg irc_msg, foo bot) bool { defer stat.Close() } sendmsg(foo.conn, msg.channel, fmt.Sprintf("success adding new super funny enjoyable line with ID %d!", line_id)) - sendmsg(foo.conn, "horscchtey", fmt.Sprintf("new line: > %s < (ID %d)", c.suffix, line_id)) + sendmsg(foo.conn, "horscchtey", fmt.Sprintf("new line: > %s < (ID %d), into groups %s", c.suffix, line_id, strings.Join(c.groups,","))) return true } diff --git a/bot.go b/bot.go index 2559d02..330b58a 100644 --- a/bot.go +++ b/bot.go @@ -23,7 +23,7 @@ func main() { boddle := bot { name: "boddle", - channel: []string{"#faui2k16", "#fau", "#sigbike", "#sigfreibad", "#faui2k17"}, + channel: []string{"#faui2k16", "#fau", "#sigbike", "#sigfreibad"}, port: 6667, server: "irc.fau.de", } diff --git a/logging.go b/logging.go index 3a905d1..02769c6 100644 --- a/logging.go +++ b/logging.go @@ -12,11 +12,7 @@ var ( ) func LOG_init() { - file, err := os.OpenFile("logs.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) - if err != nil { - log.Fatal(err) - } - defer file.Close() + file := os.Stdout LOG_INFO = log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile) LOG_WARN = log.New(file, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile)