toml to parameters

This commit is contained in:
Jonas Rabenstein 2025-01-25 00:23:04 +01:00
commit 41c1c27b1f
4 changed files with 86 additions and 78 deletions

View file

@ -10,12 +10,9 @@ import (
) )
var begin_char = []byte{'-'} var begin_char = []byte{'-'}
var db *sql.DB
var err error
// function to split advise message correctly // function to split advise message correctly
func filter(msg string, foo bot) cmd { func filter(msg string, conn net.Conn, db *sql.DB, nickname string) cmd {
var c cmd var c cmd
if len(msg) <= 0 { if len(msg) <= 0 {
@ -66,7 +63,7 @@ func filter(msg string, foo bot) cmd {
c.groups = append(c.groups, fmt.Sprintf("%d", group_id)) c.groups = append(c.groups, fmt.Sprintf("%d", group_id))
} else { } else {
if c.add { if c.add {
c.groups = append(c.groups, addgroups([]string{group}, nil)...) c.groups = append(c.groups, addgroups(db, []string{group}, nil)...)
} }
} }
rows.Close() rows.Close()
@ -110,7 +107,7 @@ func getRandomEntry(c cmd) string {
return task return task
} }
func addgroups(new_groups []string, msg *irc_msg) []string { func addgroups(db *sql.DB, new_groups []string, msg *irc_msg) []string {
stat_sel, err := db.Prepare("select id from groups where name = ?") stat_sel, err := db.Prepare("select id from groups where name = ?")
checkErr(err) checkErr(err)
stat_ins, err := db.Prepare("insert into groups(name) values (?)") stat_ins, err := db.Prepare("insert into groups(name) values (?)")
@ -141,7 +138,7 @@ func addgroups(new_groups []string, msg *irc_msg) []string {
return groupids_added return groupids_added
} }
func checkSorter(msg *irc_msg, c *cmd) bool { func checkSorter(db *sql.DB, msg *irc_msg, c *cmd) bool {
sorter_row_sel, err := db.Prepare("select id, tag_id, groups_allow, name_allow, has_groups from sorter where name = ?") sorter_row_sel, err := db.Prepare("select id, tag_id, groups_allow, name_allow, has_groups from sorter where name = ?")
checkErr(err) checkErr(err)
sorter_row, err := sorter_row_sel.Query((*c).cmd) sorter_row, err := sorter_row_sel.Query((*c).cmd)
@ -199,7 +196,7 @@ func checkSorter(msg *irc_msg, c *cmd) bool {
return true return true
} }
func chooseEntry(msg *irc_msg, c *cmd) { func chooseEntry(db *sql.DB, msg *irc_msg, c *cmd) {
task := getRandomEntry(*c) task := getRandomEntry(*c)
LOG_INFO.Printf(task) LOG_INFO.Printf(task)
@ -218,7 +215,7 @@ func chooseEntry(msg *irc_msg, c *cmd) {
} }
} }
func addLine(msg *irc_msg, line string, groups []string, cmd string) string { func addLine(db *sql.DB, msg *irc_msg, line string, groups []string, cmd string) string {
LOG_WARN.Printf("adding new stuff: %s from %s.\n", line, (*msg).author) LOG_WARN.Printf("adding new stuff: %s from %s.\n", line, (*msg).author)
res, err := db.Exec("insert into line (content, author) values (?,?)", line, (*msg).author) res, err := db.Exec("insert into line (content, author) values (?,?)", line, (*msg).author)
@ -249,10 +246,11 @@ func addLine(msg *irc_msg, line string, groups []string, cmd string) string {
(*msg).retmsg = fmt.Sprintf("success adding new super funny enjoyable line with ID %d!", line_id) (*msg).retmsg = fmt.Sprintf("success adding new super funny enjoyable line with ID %d!", line_id)
return fmt.Sprintf("new line: > %s < (ID %d), into groups %s", line, line_id, strings.Join(groups, ",")) return fmt.Sprintf("new line: > %s < (ID %d), into groups %s", line, line_id, strings.Join(groups, ","))
} }
// line: // line:
// >befehl <[groups]> <name> // >befehl <[groups]> <name>
// befehl ist genau ein wort // befehl ist genau ein wort
func parsemsg(msg *irc_msg, foo bot) bool { func parsemsg(msg *irc_msg, conn net.Conn, db *sql.DB, nickname string) bool {
if len((*msg).msg) <= 0 { if len((*msg).msg) <= 0 {
return false return false
} }
@ -265,7 +263,7 @@ func parsemsg(msg *irc_msg, foo bot) bool {
} }
(*msg).msg = (*msg).msg[1:] (*msg).msg = (*msg).msg[1:]
c := filter((*msg).msg, foo) c := filter((*msg).msg, conn, db, nickname)
if !c.valid { if !c.valid {
LOG_WARN.Printf("non valid input found.\n") LOG_WARN.Printf("non valid input found.\n")
if c.error != "" { if c.error != "" {
@ -284,7 +282,7 @@ func parsemsg(msg *irc_msg, foo bot) bool {
} }
if c.cmd == "slap" { if c.cmd == "slap" {
who := []string{(*msg).author, "\x01ACTION"} who := []string{(*msg).author, "\x01ACTION"}
whom := []string{(*msg).author, foo.Conf.Name} whom := []string{(*msg).author, nickname}
LOG_WARN.Printf("suffix: " + c.suffix) LOG_WARN.Printf("suffix: " + c.suffix)
if c.suffix != "" { if c.suffix != "" {
who = append(who, strings.Split(c.suffix, " ")...) who = append(who, strings.Split(c.suffix, " ")...)
@ -298,12 +296,12 @@ func parsemsg(msg *irc_msg, foo bot) bool {
if (c.groups != nil) { if (c.groups != nil) {
(*msg).retmsg = "Ignoring groups for the groups-adding. Well, what were you expecting...?" (*msg).retmsg = "Ignoring groups for the groups-adding. Well, what were you expecting...?"
} }
addgroups(strings.Fields((&c).suffix), msg) addgroups(db, strings.Fields((&c).suffix), msg)
return false return false
} }
// have a look at sorter table if command is valid // have a look at sorter table if command is valid
if !checkSorter(msg, &c) { if !checkSorter(db, msg, &c) {
return false return false
} }
@ -314,9 +312,9 @@ func parsemsg(msg *irc_msg, foo bot) bool {
return false; return false;
} }
c.suffix = strings.Replace(c.suffix,"\"","'", -1) c.suffix = strings.Replace(c.suffix,"\"","'", -1)
sendmsg(foo.conn, "horscchtey", addLine(msg, c.suffix, c.groups, c.cmd)) sendmsg(conn, "horscchtey", addLine(db, msg, c.suffix, c.groups, c.cmd))
} else { } else {
chooseEntry(msg, &c) chooseEntry(db, msg, &c)
} }
return true return true
} }

105
bot.go
View file

@ -36,32 +36,30 @@ func scanline_privmsg (msg string, irc *irc_msg) {
(*irc).retmsg = "" (*irc).retmsg = ""
} }
func bot_connect(bot *bot) { func bot_connect(server string) net.Conn {
conn, err := net.Dial("tcp", (*bot).Conf.Server) conn, err := net.Dial("tcp", server)
if err != nil { if err != nil {
LOG_ERR.Printf("Error while dialing server.") LOG_ERR.Printf("Error while dialing server: %s.", server)
(*bot).conn = nil return nil
return }
return conn
} }
(*bot).conn = conn func bot_register(conn net.Conn, nickname string, channels []string) {
fmt.Fprintf((*bot).conn, "USER %s 1 1 1:%s\r\n", (*bot).Conf.Name, (*bot).Conf.Name)
}
func bot_register(bot *bot) {
/* connect to irc */ /* connect to irc */
fmt.Fprintf((*bot).conn, "NICK %s\r\n", (*bot).Conf.Name) fmt.Fprintf(conn, "USER %s 1 1 1:%s\r\n", nickname, nickname)
for _, channel := range((*bot).Conf.Channels) { fmt.Fprintf(conn, "NICK %s\r\n", nickname)
fmt.Fprintf((*bot).conn, "JOIN %s\r\n", channel) for _, channel := range channels {
fmt.Fprintf(conn, "JOIN %s\r\n", channel)
} }
} }
func bot_listen(bot *bot) <-chan string { func bot_listen(conn net.Conn, db *sql.DB, nickname string, channels []string) <-chan string {
c := make(chan string) c := make(chan string)
bot_register(bot) bot_register(conn, nickname, channels)
go func(timeoutNormal time.Duration, timeoutVersion time.Duration) { go func(timeoutNormal time.Duration, timeoutVersion time.Duration) {
bufReader := bufio.NewReader((*bot).conn) bufReader := bufio.NewReader(conn)
timeoutDuration := timeoutNormal timeoutDuration := timeoutNormal
waitversion := false waitversion := false
@ -69,11 +67,11 @@ func bot_listen(bot *bot) <-chan string {
defer func() { defer func() {
fmt.Println("Closing connection...") fmt.Println("Closing connection...")
close(c) close(c)
(*bot).conn.Close() conn.Close()
}() }()
for { for {
(*bot).conn.SetReadDeadline(time.Now().Add(timeoutDuration)) conn.SetReadDeadline(time.Now().Add(timeoutDuration))
line, err := bufReader.ReadString('\n') line, err := bufReader.ReadString('\n')
if err != nil { if err != nil {
@ -84,7 +82,7 @@ func bot_listen(bot *bot) <-chan string {
return return
} }
n, err := (*bot).conn.Write([]byte("VERSION\n")) n, err := conn.Write([]byte("VERSION\n"))
fmt.Printf("n: %d, err: %s\n", n, err) fmt.Printf("n: %d, err: %s\n", n, err)
if err != nil { if err != nil {
fmt.Println("Writing to channel failed.") fmt.Println("Writing to channel failed.")
@ -106,18 +104,19 @@ func bot_listen(bot *bot) <-chan string {
c <- line c <- line
if strings.Contains(line, "PING") { if strings.Contains(line, "PING") {
(*bot).conn.Write([]byte(strings.Replace(line, "PING", "PONG", 1))) conn.Write([]byte(strings.Replace(line, "PING", "PONG", 1)))
} else if strings.Contains(line, "You have not registered") { } else if strings.Contains(line, "You have not registered") {
// set nickname // set nickname
time.Sleep(10 * time.Second) time.Sleep(10 * time.Second)
bot_register(bot) bot_register(conn, nickname, channels)
} else if strings.Contains(line, "PRIVMSG") { } else if strings.Contains(line, "PRIVMSG") {
var msg irc_msg var msg irc_msg
scanline_privmsg(line, &msg) scanline_privmsg(line, &msg)
LOG_ERR.Printf(msg.author) LOG_ERR.Printf(msg.author)
parsemsg(&msg, (*bot)) parsemsg(&msg, conn, db, nickname)
if msg.retmsg != "" { if msg.retmsg != "" {
sendmsg((*bot).conn, msg.channel, msg.retmsg) sendmsg(conn, msg.channel, msg.retmsg)
} }
} }
} }
@ -126,36 +125,72 @@ func bot_listen(bot *bot) <-chan string {
return c return c
} }
func bot_run(bot *bot) { func db_open(info string) *sql.DB {
LOG_INFO.Printf("Opening database: %s", info)
var db *sql.DB = nil
var err error
parts := strings.SplitN(info, ":", 2)
if len(parts) == 2 {
db, err = sql.Open(parts[0], parts[1])
} else {
db, err = sql.Open("sqlite3", info)
}
if err != nil {
return nil
}
return db
}
func bot_run(server string, nickname string, database string, channels []string) {
LOG_INFO.Println("Bot ready to run.") LOG_INFO.Println("Bot ready to run.")
LOG_INFO.Println("Opening database.") db := db_open(database)
db, err = sql.Open("sqlite3", (*bot).Conf.Database) if db == nil {
if err != nil {
LOG_ERR.Println("Opening database failed.") LOG_ERR.Println("Opening database failed.")
return return
} }
for { for {
bot_connect(bot) conn := bot_connect(server)
if bot.conn == nil { if conn == nil {
LOG_INFO.Printf("Bot is nil. Try to connect again.") LOG_INFO.Printf("Bot is nil. Try to connect again.")
time.Sleep(10 * time.Second) time.Sleep(10 * time.Second)
continue continue
} }
for val := range bot_listen(bot) {
for val := range bot_listen(conn, db, nickname, channels) {
LOG_INFO.Printf("%s", val) LOG_INFO.Printf("%s", val)
} }
} }
} }
type stringList []string
func (i *stringList) String() string {
return fmt.Sprintf("%v", *i)
}
func (i *stringList) Set(value string) error {
*i = append(*i, value)
return nil
}
func main() { func main() {
LOG_init() LOG_init()
var boddle bot var channels stringList
if err := configo.Load("./boddle.toml", &boddle.Conf); err != nil {
log.Fatal(err)
}
bot_run(&boddle) flag.Var(&channels, "channel", "channels to connect")
server := flag.String("server", "irc.ircnet.com:6667", "domain:port for irc-server")
nickname := flag.String("nick", "boddle", "nickname to use for bot")
database := flag.String("database", "./boddle.db", "database to use")
flag.Parse()
LOG_INFO.Printf("server: %s", *server)
LOG_INFO.Printf("nick: %s", *nickname)
bot_run(*server, *nickname, *database, channels)
} }

View file

@ -1,8 +0,0 @@
package main
type Boddle struct {
name string `cfg:"name; boddle; printableascii; IRC nick of bot"`
channels []string `cfg:"channels; required; printableascii; Channel list to join to"`
server string `cfg:"server; required; netaddr; Server name to connect to"`
database string `cfg:"database; ./boddle.db; path; Path to database"`
}

View file

@ -1,16 +1,5 @@
package main package main
import (
"net"
)
type Config struct {
Name string `cfg:"name; boddle; printableascii; IRC nick of bot"`
Channels []string `cfg:"channels; required; printableascii; Channel list to join to"`
Server string `cfg:"server; required; netaddr; Server name to connect to"`
Database string `cfg:"database; ./boddle.db; path; Path to database"`
}
type irc_msg struct { type irc_msg struct {
channel string channel string
msg string msg string
@ -26,9 +15,3 @@ type cmd struct {
suffix string suffix string
error string error string
} }
type bot struct {
Conf Config
conn net.Conn
}