toml to parameters
This commit is contained in:
parent
fd022bddfd
commit
41c1c27b1f
4 changed files with 86 additions and 78 deletions
107
bot.go
107
bot.go
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue