Уходим с Python на Go: первые успехи #5

Merged
anufriev.g.a merged 17 commits from go into main 2023-03-15 16:33:43 +04:00
7 changed files with 192 additions and 8 deletions
Showing only changes of commit 3a3479b6e3 - Show all commits

View File

@ -42,6 +42,8 @@ func main() {
bot.Start()
} else if tg_user.PosTag == "add" {
bot.Find(msg.Text)
} else if msg.Text == "Главное меню" {
bot.GetSummary()
} else {
bot.Etc()
}

View File

@ -14,7 +14,7 @@ type TgUser struct {
}
type ShedulesInUser struct {
UID int64 `xorm:"pk"`
UID int64 `xorm:"pk autoincr"` // Не забывать про автоинкремент!!!
L9Id int64
IsTeacher bool
SheduleId int64

View File

@ -76,7 +76,7 @@ func Parse(doc *goquery.Document, isGroup bool, sheduleId int64, week int) (*She
if err != nil {
return nil, err
}
idx := (len(raw_times)-2)*t/2 + d
idx := (len(raw_times)/2+1)*t/2 + d
lesson := Lesson{
Begin: begin,
End: end,

View File

@ -127,11 +127,11 @@ func (bot *Bot) Find(query string) error {
return err
}
func (bot *Bot) Confirm(query *tgbotapi.CallbackQuery) {
func (bot *Bot) Confirm(query *tgbotapi.CallbackQuery) error {
isGroup := bot.TG_user.PosTag == "confirm_group"
groupId, err := strconv.ParseInt(query.Data, 0, 64)
if err != nil {
log.Fatal(err)
return err
}
var groups []database.ShedulesInUser
err = bot.DB.Find(&groups, &database.ShedulesInUser{
@ -140,7 +140,7 @@ func (bot *Bot) Confirm(query *tgbotapi.CallbackQuery) {
IsTeacher: !isGroup,
})
if err != nil {
log.Fatal(err)
return err
}
if len(groups) == 0 {
shInUser := database.ShedulesInUser{
@ -151,10 +151,15 @@ func (bot *Bot) Confirm(query *tgbotapi.CallbackQuery) {
bot.DB.InsertOne(shInUser)
bot.DeleteMsg(query)
msg := tgbotapi.NewMessage(bot.TG_user.TgId, "Подключено!")
keyboard := tgbotapi.NewReplyKeyboard([]tgbotapi.KeyboardButton{tgbotapi.NewKeyboardButton("Главное меню")})
msg.ReplyMarkup = keyboard
bot.TG.Send(msg)
bot.TG_user.PosTag = "ready"
bot.DB.Update(bot.TG_user)
err = bot.UpdateUserDB()
if err != nil {
return err
}
} else {
var msg string
if isGroup {
@ -165,9 +170,10 @@ func (bot *Bot) Confirm(query *tgbotapi.CallbackQuery) {
callback := tgbotapi.NewCallback(query.ID, msg)
bot.TG.Request(callback)
}
return nil
}
func (bot *Bot) Cancel(query *tgbotapi.CallbackQuery) {
func (bot *Bot) Cancel(query *tgbotapi.CallbackQuery) error {
shedules, err := bot.DB.Count(&database.ShedulesInUser{
L9Id: bot.TG_user.L9Id,
})
@ -176,7 +182,10 @@ func (bot *Bot) Cancel(query *tgbotapi.CallbackQuery) {
}
if shedules == 0 {
bot.TG_user.PosTag = "add"
bot.DB.Update(bot.TG_user)
err = bot.UpdateUserDB()
if err != nil {
return err
}
bot.DeleteMsg(query)
msg := tgbotapi.NewMessage(
bot.TG_user.TgId,
@ -185,8 +194,13 @@ func (bot *Bot) Cancel(query *tgbotapi.CallbackQuery) {
bot.TG.Send(msg)
} else {
bot.TG_user.PosTag = "ready"
err = bot.UpdateUserDB()
if err != nil {
return err
}
bot.DeleteMsg(query)
}
return nil
}
func (bot *Bot) Etc() {

129
modules/tg/shedule.go Normal file
View File

@ -0,0 +1,129 @@
package tg
import (
"fmt"
"log"
"strconv"
"strings"
"time"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"xorm.io/xorm"
)
func (bot *Bot) GetSummary() {
now := time.Now()
log.Println(now.Format("01-02-2006 15:04:05 -07"), now.Format("01-02-2006 15:04:05"))
var lessons []database.Lesson
var shedules []database.ShedulesInUser
bot.DB.ID(bot.TG_user.L9Id).Find(&shedules)
var groups []string
var teachers []string
for _, sh := range shedules {
if sh.IsTeacher {
teachers = append(teachers, strconv.FormatInt(sh.SheduleId, 10))
} else {
groups = append(groups, strconv.FormatInt(sh.SheduleId, 10))
}
}
teachers_str := strings.Join(teachers, ",")
groups_str := strings.Join(groups, ",")
bot.DB.
Where("begin > ?", now.Format("2006-01-02 15:04:05")).
And("groupId in (?) or teacherId in (?)", groups_str, teachers_str).
OrderBy("begin").
Limit(6).
Find(&lessons)
log.Println(lessons)
if len(lessons) != 0 {
var firstPair, secondPair []database.Lesson
l_idx := 0
day := lessons[0].Begin
// Я хз, надо ли упарываться для случаев с более чем двумя подпарами
for lessons[l_idx].Begin == day && l_idx < len(lessons) {
firstPair = append(firstPair, lessons[l_idx])
l_idx++
}
if l_idx < len(lessons) {
day = lessons[l_idx].Begin
for lessons[l_idx].Begin == day && l_idx < len(lessons) {
secondPair = append(secondPair, lessons[l_idx])
l_idx++
}
}
log.Println(firstPair, secondPair)
var str string
if firstPair[0].Begin.Day() != time.Now().Day() {
str = "❗️Сегодня пар нет\nБлижайшие занятия "
if time.Until(firstPair[0].Begin).Hours() < 48 {
str += "завтра\n"
} else {
str += fmt.Sprintf("%s\n\n", firstPair[0].Begin.Format("02.01"))
}
}
firstPairStr, _ := PairToStr(firstPair, &bot.DB)
str += firstPairStr
if len(secondPair) != 0 && firstPair[0].Begin.Day() == secondPair[0].Begin.Day() {
secondPairStr, _ := PairToStr(secondPair, &bot.DB)
str += secondPairStr
}
msg := tgbotapi.NewMessage(bot.TG_user.TgId, str)
bot.TG.Send(msg)
}
}
func PairToStr(pair []database.Lesson, db *xorm.Engine) (string, error) {
var str string
beginStr := pair[0].Begin.Format("15:04")
endStr := pair[0].End.Format("15:04")
str = fmt.Sprintf("📆 %s - %s\n", beginStr, endStr)
for _, sublesson := range pair {
var type_emoji string
switch sublesson.Type {
case "lect":
type_emoji = "📗"
case "pract":
type_emoji = "📕"
case "lab":
type_emoji = "📘"
case "other":
type_emoji = "📙"
default:
type_emoji = "📙"
}
str += fmt.Sprintf("%s%s\n", type_emoji, sublesson.Name)
if sublesson.Place != "" {
str += fmt.Sprintf("🧭%s\n", sublesson.Place)
}
if sublesson.TeacherId != 0 {
var t database.Teacher
_, err := db.ID(sublesson.TeacherId).Get(&t)
if err != nil {
return "", err
}
name := fmt.Sprintf("%s %s.%s.", t.LastName, t.FirstName[0:2], t.MidName[0:2])
str += fmt.Sprintf("👤%s\n", name)
}
if sublesson.SubGroup != "" {
str += fmt.Sprintf("👥%s\n", sublesson.SubGroup)
}
if sublesson.Comment != "" {
str += fmt.Sprintf("💬%s\n", sublesson.Comment)
}
str += "--------------------------------\n"
}
return str, nil
}

34
modules/tg/tg_test.go Normal file
View File

@ -0,0 +1,34 @@
package tg
import (
"log"
"os"
"testing"
"git.l9labs.ru/anufriev.g.a/l9_stud_bot/modules/database"
"github.com/joho/godotenv"
)
func TestGetSummary(t *testing.T) {
if err := godotenv.Load(); err != nil {
log.Fatal("No .env file found")
}
engine, err := database.Connect(os.Getenv("MYSQL_USER"), os.Getenv("MYSQL_PASS"), os.Getenv("MYSQL_DB"))
if err != nil {
log.Fatal(err)
}
bot := new(Bot)
err = bot.InitBot(os.Getenv("TELEGRAM_APITOKEN"), *engine)
if err != nil {
log.Fatal(err)
}
bot.TG_user = database.TgUser{
L9Id: 316268749,
TgId: 1086707888,
}
bot.GetSummary()
}

View File

@ -46,3 +46,8 @@ func (bot *Bot) DeleteMsg(query *tgbotapi.CallbackQuery) {
delete := tgbotapi.NewDeleteMessage(query.From.ID, query.Message.MessageID)
bot.TG.Request(delete)
}
func (bot *Bot) UpdateUserDB() error {
_, err := bot.DB.ID(bot.TG_user.L9Id).Update(bot.TG_user)
return err
}