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 db *sql.DB
var err error
// 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
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))
} else {
if c.add {
c.groups = append(c.groups, addgroups([]string{group}, nil)...)
c.groups = append(c.groups, addgroups(db, []string{group}, nil)...)
}
}
rows.Close()
@ -110,7 +107,7 @@ func getRandomEntry(c cmd) string {
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 = ?")
checkErr(err)
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
}
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 = ?")
checkErr(err)
sorter_row, err := sorter_row_sel.Query((*c).cmd)
@ -199,7 +196,7 @@ func checkSorter(msg *irc_msg, c *cmd) bool {
return true
}
func chooseEntry(msg *irc_msg, c *cmd) {
func chooseEntry(db *sql.DB, msg *irc_msg, c *cmd) {
task := getRandomEntry(*c)
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)
res, err := db.Exec("insert into line (content, author) values (?,?)", line, (*msg).author)
@ -247,12 +244,13 @@ func addLine(msg *irc_msg, line string, groups []string, cmd string) string {
defer stat.Close()
}
(*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:
// >befehl <[groups]> <name>
// 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 {
return false
}
@ -265,7 +263,7 @@ func parsemsg(msg *irc_msg, foo bot) bool {
}
(*msg).msg = (*msg).msg[1:]
c := filter((*msg).msg, foo)
c := filter((*msg).msg, conn, db, nickname)
if !c.valid {
LOG_WARN.Printf("non valid input found.\n")
if c.error != "" {
@ -284,7 +282,7 @@ func parsemsg(msg *irc_msg, foo bot) bool {
}
if c.cmd == "slap" {
who := []string{(*msg).author, "\x01ACTION"}
whom := []string{(*msg).author, foo.Conf.Name}
whom := []string{(*msg).author, nickname}
LOG_WARN.Printf("suffix: " + c.suffix)
if 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) {
(*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
}
// have a look at sorter table if command is valid
if !checkSorter(msg, &c) {
if !checkSorter(db, msg, &c) {
return false
}
@ -314,9 +312,9 @@ func parsemsg(msg *irc_msg, foo bot) bool {
return false;
}
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 {
chooseEntry(msg, &c)
chooseEntry(db, msg, &c)
}
return true
}

107
bot.go
View file

@ -12,7 +12,7 @@ import (
_ "github.com/mattn/go-sqlite3"
)
func sendmsg (conn net.Conn, channel string, msg string) {
func sendmsg(conn net.Conn, channel string, msg string) {
mesg := fmt.Sprintf("PRIVMSG %s :%s\r\n", channel, msg)
fmt.Printf(mesg)
conn.Write([]byte(mesg))
@ -36,32 +36,30 @@ func scanline_privmsg (msg string, irc *irc_msg) {
(*irc).retmsg = ""
}
func bot_connect(bot *bot) {
conn, err := net.Dial("tcp", (*bot).Conf.Server)
func bot_connect(server string) net.Conn {
conn, err := net.Dial("tcp", server)
if err != nil {
LOG_ERR.Printf("Error while dialing server.")
(*bot).conn = nil
return
LOG_ERR.Printf("Error while dialing server: %s.", server)
return nil
}
(*bot).conn = conn
fmt.Fprintf((*bot).conn, "USER %s 1 1 1:%s\r\n", (*bot).Conf.Name, (*bot).Conf.Name)
return conn
}
func bot_register(bot *bot) {
func bot_register(conn net.Conn, nickname string, channels []string) {
/* connect to irc */
fmt.Fprintf((*bot).conn, "NICK %s\r\n", (*bot).Conf.Name)
for _, channel := range((*bot).Conf.Channels) {
fmt.Fprintf((*bot).conn, "JOIN %s\r\n", channel)
fmt.Fprintf(conn, "USER %s 1 1 1:%s\r\n", nickname, nickname)
fmt.Fprintf(conn, "NICK %s\r\n", nickname)
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)
bot_register(bot)
bot_register(conn, nickname, channels)
go func(timeoutNormal time.Duration, timeoutVersion time.Duration) {
bufReader := bufio.NewReader((*bot).conn)
bufReader := bufio.NewReader(conn)
timeoutDuration := timeoutNormal
waitversion := false
@ -69,11 +67,11 @@ func bot_listen(bot *bot) <-chan string {
defer func() {
fmt.Println("Closing connection...")
close(c)
(*bot).conn.Close()
conn.Close()
}()
for {
(*bot).conn.SetReadDeadline(time.Now().Add(timeoutDuration))
conn.SetReadDeadline(time.Now().Add(timeoutDuration))
line, err := bufReader.ReadString('\n')
if err != nil {
@ -84,7 +82,7 @@ func bot_listen(bot *bot) <-chan string {
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)
if err != nil {
fmt.Println("Writing to channel failed.")
@ -106,56 +104,93 @@ func bot_listen(bot *bot) <-chan string {
c <- line
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") {
// set nickname
time.Sleep(10 * time.Second)
bot_register(bot)
bot_register(conn, nickname, channels)
} else if strings.Contains(line, "PRIVMSG") {
var msg irc_msg
scanline_privmsg(line, &msg)
LOG_ERR.Printf(msg.author)
parsemsg(&msg, (*bot))
parsemsg(&msg, conn, db, nickname)
if msg.retmsg != "" {
sendmsg((*bot).conn, msg.channel, msg.retmsg)
sendmsg(conn, msg.channel, msg.retmsg)
}
}
}
} (4 * time.Minute, 1 * time.Minute)
}(4*time.Minute, 1*time.Minute)
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("Opening database.")
db, err = sql.Open("sqlite3", (*bot).Conf.Database)
if err != nil {
db := db_open(database)
if db == nil {
LOG_ERR.Println("Opening database failed.")
return
}
for {
bot_connect(bot)
if bot.conn == nil {
conn := bot_connect(server)
if conn == nil {
LOG_INFO.Printf("Bot is nil. Try to connect again.")
time.Sleep(10 * time.Second)
continue
}
for val := range bot_listen(bot) {
for val := range bot_listen(conn, db, nickname, channels) {
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() {
LOG_init()
var boddle bot
if err := configo.Load("./boddle.toml", &boddle.Conf); err != nil {
log.Fatal(err)
}
var channels stringList
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
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 {
channel string
msg string
@ -26,9 +15,3 @@ type cmd struct {
suffix string
error string
}
type bot struct {
Conf Config
conn net.Conn
}