175 lines
3.1 KiB
Go
175 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"math/rand"
|
|
"strings"
|
|
"time"
|
|
|
|
"xeserv.us/r1459"
|
|
|
|
"gopkg.in/telegram-bot-api.v4"
|
|
)
|
|
|
|
type Room struct {
|
|
ID int
|
|
RoomID int64 `storm:"index" storm:"unique"`
|
|
Title string
|
|
Shortname string `storm:"index" storm:"unique"`
|
|
CreationDate time.Time
|
|
|
|
Members []string
|
|
|
|
client *Client
|
|
}
|
|
|
|
func (c *Client) MakeRoom(shortname string, roomID int64) (*Room, error) {
|
|
room := &Room{}
|
|
err := c.DB.One("RoomID", roomID, room)
|
|
if err != nil {
|
|
chat, err := c.TGBot.GetChat(tgbotapi.ChatConfig{
|
|
ChatID: roomID,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
room = &Room{
|
|
ID: rand.Int(),
|
|
RoomID: roomID,
|
|
Title: chat.Title,
|
|
Shortname: shortname,
|
|
CreationDate: time.Now(),
|
|
Members: []string{},
|
|
}
|
|
|
|
admins, err := c.TGBot.GetChatAdministrators(tgbotapi.ChatConfig{
|
|
ChatID: roomID,
|
|
})
|
|
|
|
var nicks []string
|
|
|
|
for _, admin := range admins {
|
|
var status string
|
|
if admin.IsCreator() {
|
|
status = "~"
|
|
} else {
|
|
status = "&"
|
|
}
|
|
nicks = append(nicks, status+admin.User.UserName)
|
|
}
|
|
|
|
nicks = append(nicks, c.Nick)
|
|
|
|
room.Members = append(room.Members, nicks...)
|
|
|
|
c.DB.Save(room)
|
|
}
|
|
|
|
room.client = c
|
|
|
|
return room, nil
|
|
}
|
|
|
|
func (r *Room) Burst() []*r1459.RawLine {
|
|
ret := []*r1459.RawLine{}
|
|
c := r.client
|
|
|
|
ret = append(ret, &r1459.RawLine{
|
|
Verb: "JOIN",
|
|
Source: Mask(c.Nick),
|
|
Args: []string{
|
|
fmt.Sprintf("#%v", r.Shortname),
|
|
},
|
|
})
|
|
|
|
ret = append(ret, &r1459.RawLine{
|
|
Verb: "MODE",
|
|
Source: "xeserv.us",
|
|
Args: []string{
|
|
fmt.Sprintf("#%v", r.Shortname),
|
|
"+nt",
|
|
},
|
|
})
|
|
|
|
ret = append(ret, &r1459.RawLine{
|
|
Verb: "TOPIC",
|
|
Source: "xeserv.us",
|
|
Args: []string{
|
|
fmt.Sprintf("#%v", r.Shortname),
|
|
r.Title,
|
|
},
|
|
})
|
|
|
|
ret = append(ret, &r1459.RawLine{
|
|
Verb: "353",
|
|
Source: "xeserv.us",
|
|
Args: []string{
|
|
c.Nick, "=", fmt.Sprintf("#%v", r.Shortname),
|
|
strings.Join(r.Members, " "),
|
|
},
|
|
})
|
|
|
|
ret = append(ret, &r1459.RawLine{
|
|
Verb: "366",
|
|
Source: "xeserv.us",
|
|
Args: []string{
|
|
c.Nick, fmt.Sprintf("#%v", r.Shortname),
|
|
"End of /NAMES list",
|
|
},
|
|
})
|
|
|
|
return ret
|
|
}
|
|
|
|
func (r Room) RecieveMessage(update tgbotapi.Update) {
|
|
c := r.client
|
|
|
|
if c == nil {
|
|
return
|
|
}
|
|
|
|
log.Printf("[#%v] %s %s", r.Shortname, update.Message.From.UserName, update.Message.Text)
|
|
|
|
found := false
|
|
for _, member := range r.Members {
|
|
if member == "" {
|
|
continue
|
|
}
|
|
if update.Message.From.UserName == member[1:] || update.Message.From.UserName == member {
|
|
found = true
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
r.Members = append(r.Members, update.Message.From.UserName)
|
|
c.DB.Save(&r)
|
|
|
|
c.SendLine(&r1459.RawLine{
|
|
Verb: "JOIN",
|
|
Source: Mask(update.Message.From.UserName),
|
|
Args: []string{
|
|
"#" + r.Shortname,
|
|
},
|
|
})
|
|
}
|
|
|
|
for _, msgLine := range strings.Split(update.Message.Text, "\n") {
|
|
c.SendLine(&r1459.RawLine{
|
|
Verb: "PRIVMSG",
|
|
Source: Mask(update.Message.From.UserName),
|
|
Args: []string{
|
|
"#" + r.Shortname,
|
|
msgLine,
|
|
},
|
|
})
|
|
}
|
|
}
|
|
|
|
func (r Room) SendMessage(l *r1459.RawLine) error {
|
|
msg := tgbotapi.NewMessage(r.RoomID, l.Args[1])
|
|
_, err := r.client.TGBot.Send(msg)
|
|
return err
|
|
}
|