This commit is contained in:
shoopea 2019-05-03 11:58:36 +08:00
parent 09439ce697
commit a465276246
5 changed files with 249 additions and 192 deletions

130
bot.go
View File

@ -1,65 +1,65 @@
package main
import (
"time"
"log"
"fmt"
tb "gopkg.in/tucnak/telebot.v2"
)
var (
b *tb.Bot
)
func StartBot() {
// Registering bot
b, err := tb.NewBot(tb.Settings{
Token: cfg.Telegram.Token,
URL: cfg.Telegram.URL,
Poller: &tb.LongPoller{Timeout: 10 * time.Second},
})
if err != nil {
log.Fatal(err)
return
}
b.Handle("/hello", botHello)
b.Handle(tb.OnPhoto, botPhoto)
b.Handle(tb.OnChannelPost, botChannelPost)
b.Handle(tb.OnQuery, botQuery)
b.Handle(tb.OnText, botText)
b.Start()
}
func botPhoto(m *tb.Message) {
fmt.Println("OnPhoto :", m.Text)
// photos only
}
func botHello(m *tb.Message) {
if !m.Private() {
return
}
// fmt.Println("Hello payload :", m.Payload) // <PAYLOAD>
PrintText(m)
b.Send(m.Sender, "hello world")
}
func botChannelPost(m *tb.Message) {
fmt.Println("OnChannelPost :", m.Text)
PrintText(m)
// channel posts only
}
func botQuery(q *tb.Query) {
fmt.Println("Query ?")
// incoming inline queries
}
func botText(m *tb.Message) {
PrintText(m)
// all the text messages that weren't
// captured by existing handlers
}
package main
import (
"fmt"
tb "gopkg.in/tucnak/telebot.v2"
"log"
"time"
)
var (
b *tb.Bot
)
func StartBot() {
// Registering bot
b, err := tb.NewBot(tb.Settings{
Token: cfg.Telegram.Token,
URL: cfg.Telegram.URL,
Poller: &tb.LongPoller{Timeout: 10 * time.Second},
})
if err != nil {
log.Fatal(err)
return
}
b.Handle("/hello", botHello)
b.Handle(tb.OnPhoto, botPhoto)
b.Handle(tb.OnChannelPost, botChannelPost)
b.Handle(tb.OnQuery, botQuery)
b.Handle(tb.OnText, botText)
b.Start()
}
func botPhoto(m *tb.Message) {
fmt.Println("OnPhoto :", m.Text)
// photos only
}
func botHello(m *tb.Message) {
if !m.Private() {
return
}
// fmt.Println("Hello payload :", m.Payload) // <PAYLOAD>
PrintText(m)
b.Send(m.Sender, "hello world")
}
func botChannelPost(m *tb.Message) {
fmt.Println("OnChannelPost :", m.Text)
PrintText(m)
// channel posts only
}
func botQuery(q *tb.Query) {
fmt.Println("Query ?")
// incoming inline queries
}
func botText(m *tb.Message) {
PrintText(m)
// all the text messages that weren't
// captured by existing handlers
}

90
main.go
View File

@ -1,49 +1,49 @@
package main
import (
"time"
"log"
"flag"
"fmt"
"database/sql"
"flag"
"fmt"
_ "github.com/go-sql-driver/mysql"
"gopkg.in/gcfg.v1"
tb "gopkg.in/tucnak/telebot.v2"
"log"
"time"
)
type Config struct {
Telegram struct {
URL string
Token string
URL string
Token string
}
SQL struct {
Driver string
Type string
Address string
Username string
Password string
Database string
Driver string
Type string
Address string
Username string
Password string
Database string
}
Rabbit struct {
User string
Password string
Host string
Queue string
User string
Password string
Host string
Queue string
}
Bot struct {
Admin uint64
Guildname string
Guild string
Admin uint64
Guildname string
Guild string
}
}
var (
config = flag.String("config", "chirpnest.cfg", "config file path")
initdb = flag.Bool("initdb", false, "initialize bot database")
db *sql.DB
config = flag.String("config", "chirpnest.cfg", "config file path")
initdb = flag.Bool("initdb", false, "initialize bot database")
cfg Config
db *sql.DB
cfg Config
)
func PrintText(m *tb.Message) {
@ -53,26 +53,26 @@ func PrintText(m *tb.Message) {
func main() {
log.Println("Starting Chirpnest...")
// Parsing config
flag.Parse()
flag.Parse()
err := gcfg.ReadFileInto(&cfg, *config)
if err != nil {
log.Fatalf("Failed to parse gcfg data: %s", err)
}
// Connecting to DB
switch cfg.SQL.Driver {
case "mysql":
db, err = sql.Open("mysql",cfg.SQL.Username + ":" + cfg.SQL.Password + "@" + cfg.SQL.Type + "(" + cfg.SQL.Address + ")/" + cfg.SQL.Database)
if err != nil {
log.Fatal(err)
}
defer db.Close()
case "mysql":
db, err = sql.Open("mysql", cfg.SQL.Username+":"+cfg.SQL.Password+"@"+cfg.SQL.Type+"("+cfg.SQL.Address+")/"+cfg.SQL.Database)
if err != nil {
log.Fatal(err)
}
defer db.Close()
}
// Check if any issue
err = db.Ping()
if err != nil {
@ -80,18 +80,18 @@ func main() {
} else {
log.Println("SQL connection initialized")
}
if (*initdb) {
if *initdb {
initDB()
}
go StartBot()
fmt.Println("Started !")
fmt.Println("Started !")
// Main loop
for {
time.Sleep(1 * time.Second)
}
// Main loop
for {
time.Sleep(1 * time.Second)
}
}
}

49
mq.go Normal file
View File

@ -0,0 +1,49 @@
package main
import (
"log"
"github.com/streadway/amqp"
)
func MQMainReceive() {
conn, err := amqp.Dial("amqp://shoopea:UmDd5g4WRa2MzqOHsG2T@localhost:5672/chatwars")
failOnError(err, "MQMainReceive : Failed to connect to RabbitMQ")
defer conn.Close()
ch, err := conn.Channel()
failOnError(err, "MQMainReceive : Failed to open a channel")
defer ch.Close()
q, err := ch.QueueDeclare(
"msg", // name
false, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
failOnError(err, "MQMainReceive : Failed to declare a queue")
msgs, err := ch.Consume(
q.Name, // queue
"", // consumer
true, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
failOnError(err, "MQMainReceive : Failed to register a consumer")
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("MQMainReceive : Received a message: %s", d.Body)
}
}()
<-forever
}

161
sql.go
View File

@ -1,82 +1,79 @@
package main
import (
"log"
)
func initDB() {
log.Println("Setting up database...")
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer tx.Rollback()
_, err = tx.Exec("set foreign_key_checks = 0")
if err != nil {
log.Fatal(err)
}
var name string
rows, err := db.Query("show tables")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
err = rows.Scan(&name)
if err != nil {
log.Fatal(err)
}
_, err = tx.Exec("drop table " + name)
if err != nil {
log.Fatal(err)
}
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
rows.Close()
_, err = tx.Exec("set foreign_key_checks = 1")
if err != nil {
log.Fatal(err)
}
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
log.Println("Database cleaned up")
_, err = db.Exec( `CREATE TABLE user (
id BIGINT UNSIGNED NOT NULL,
user_id VARCHAR(32) NOT NULL,
name VARCHAR(80) NOT NULL,
guild_id SMALLINT(5),
last_msg TIMESTAMP,
busy_until TIMESTAMP,
role ENUM('commander', 'bartebder', 'squire', 'none'),
PRIMARY KEY (id)
) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`)
if err != nil {
log.Fatal(err)
}
_, err = db.Exec( `CREATE TABLE msg (
id BIGINT UNSIGNED NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
direction ENUM('incoming', 'outgoing'),
text VARCHAR(4096) NOT NULL,
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`)
if err != nil {
log.Fatal(err)
}
log.Println("Database set up")
}
package main
import (
"log"
)
func initDB() {
log.Println("Setting up database...")
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer tx.Rollback()
_, err = tx.Exec("set foreign_key_checks = 0")
if err != nil {
log.Fatal(err)
}
var name string
rows, err := db.Query("show tables")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
err = rows.Scan(&name)
if err != nil {
log.Fatal(err)
}
_, err = tx.Exec("drop table " + name)
if err != nil {
log.Fatal(err)
}
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
rows.Close()
_, err = tx.Exec("set foreign_key_checks = 1")
if err != nil {
log.Fatal(err)
}
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
log.Println("Database cleaned up")
_, err = db.Exec(`CREATE TABLE user (
id BIGINT UNSIGNED NOT NULL,
user_id VARCHAR(32) NOT NULL,
name VARCHAR(80) NOT NULL,
guild_id SMALLINT(5),
last_msg TIMESTAMP,
busy_until TIMESTAMP,
role ENUM('commander', 'bartebder', 'squire', 'none'),
PRIMARY KEY (id)
) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`)
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(`CREATE TABLE msg (
id BIGINT UNSIGNED NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
direction ENUM('incoming', 'outgoing'),
text VARCHAR(4096) NOT NULL,
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`)
if err != nil {
log.Fatal(err)
}
log.Println("Database set up")
}

11
utils.go Normal file
View File

@ -0,0 +1,11 @@
package main
import (
"log"
)
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}