diff --git a/commands.go b/commands.go index 3820178..e5212b7 100644 --- a/commands.go +++ b/commands.go @@ -8,22 +8,24 @@ import ( var commandMe = neco.NewCommand("me", "Пишу ваш текст о вас в третьем лице", false) -func handleMe(u *neco.UpdateCommand) error { - _, err := u.AnswerMarkdown(fmt.Sprintf("_*%s* %s_", neco.EscapeMd2(u.From().FirstName), neco.EscapeMd2(u.Param))) +func handleMe(u *neco.Update) error { + param := commandMe.Param(u.Text()) + _, err := u.AnswerMarkdown(fmt.Sprintf("_*%s* %s_", neco.EscapeMd2(u.From().FirstName), neco.EscapeMd2(param))) return err } var commandHelp = neco.NewCommand("help", "Показываю данный текст", false) -func handleHelp(u *neco.UpdateCommand) error { +func handleHelp(u *neco.Update) error { _, err := u.AnswerPlain("Тут текст помощи") return err } var commandSay = neco.NewCommand("say", "Пишу ваш текст от своего имени.", true) -func handleSay(u *neco.UpdateCommand) error { - _, err := u.AnswerMarkdown(fmt.Sprintf("*_%s_*", neco.EscapeMd2(u.Param))) +func handleSay(u *neco.Update) error { + param := commandMe.Param(u.Text()) + _, err := u.AnswerMarkdown(fmt.Sprintf("*_%s_*", neco.EscapeMd2(param))) return err } diff --git a/go.mod b/go.mod index 22c3ced..4d948f4 100644 --- a/go.mod +++ b/go.mod @@ -6,4 +6,5 @@ require ( git.nefrace.ru/nefrace/nechotron v0.0.0-20230119201747-5842815c958c github.com/NicoNex/echotron/v3 v3.22.0 github.com/google/uuid v1.3.0 + github.com/joho/godotenv v1.4.0 ) diff --git a/go.sum b/go.sum index 2194fcd..d99d1f2 100644 --- a/go.sum +++ b/go.sum @@ -4,3 +4,5 @@ github.com/NicoNex/echotron/v3 v3.22.0 h1:2ymJcjKqtZ/rfD5CveR2VKqQob7JmRgJmoLOJ3 github.com/NicoNex/echotron/v3 v3.22.0/go.mod h1:LpP5IyHw0y+DZUZMBgXEDAF9O8feXrQu7w7nlJzzoZI= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= diff --git a/handlers.go b/handlers.go new file mode 100644 index 0000000..9805156 --- /dev/null +++ b/handlers.go @@ -0,0 +1,8 @@ +package main + +import "git.nefrace.ru/nefrace/nechotron" + +func handleAdmin(u *nechotron.Update) error { + u.AnswerPlain("Вы админ!") + return nil +} diff --git a/main.go b/main.go index fca9590..72db483 100644 --- a/main.go +++ b/main.go @@ -2,15 +2,25 @@ package main import ( "log" + "os" "git.nefrace.ru/nefrace/nechotron" + "git.nefrace.ru/nefrace/tongo" + "github.com/joho/godotenv" ) var BuildTime string func main() { - neco := nechotron.NewTron("1698825178:AAHy4Er7z768CmYy9M5drJOMQO2S-QnwdTI", &MainState) - neco.Use(UserLogger) + godotenv.Load() + db, err := tongo.NewConnection(os.Getenv("MONGO_URI"), "godette") + if err != nil { + log.Fatalf("Can't connect to database: %v", err) + } + neco := nechotron.NewTron(os.Getenv("TELEGRAM_TOKEN"), &MainState) + neco. + Use(UserDBUpdater(db)). + Use(UserLogger) // neko.ApiServer = "http://192.168.100.15:7373" log.Fatal(neco.DispatchPoll()) } diff --git a/middleware.go b/middleware.go index 7b9382c..2d6517a 100644 --- a/middleware.go +++ b/middleware.go @@ -1,15 +1,54 @@ package main import ( + "context" "log" + "time" "git.nefrace.ru/nefrace/nechotron" + "git.nefrace.ru/nefrace/tongo" ) func UserLogger(next nechotron.UpdateHandler) nechotron.UpdateHandler { return func(u *nechotron.Update) error { log.Println(u.From().FirstName) - next(u) - return nil + err := next(u) + return err + } +} + +func UserDBUpdater(db *tongo.Database) nechotron.Middleware { + return func(next nechotron.UpdateHandler) nechotron.UpdateHandler { + return func(u *nechotron.Update) error { + store := tongo.NewStore[User](db) + from := u.From() + user, err := store.GetOne(u.Ctx, tongo.E("id", from.ID)) + if err != nil { + user = &User{ + Item: tongo.NewID(), + ID: from.ID, + } + } + user.FirstName = from.FirstName + user.LastName = from.LastName + user.Username = from.Username + user.LastMessage = time.Now() + err = store.ReplaceItem(u.Ctx, *user, true) + if err != nil { + log.Println("Cant replace user: ", err) + } + u.Ctx = context.WithValue(u.Ctx, "dbuser", user) + return next(u) + } + } +} + +func ErrorLogger(next nechotron.UpdateHandler) nechotron.UpdateHandler { + return func(u *nechotron.Update) error { + err := next(u) + if err != nil { + u.LogError("", err, true) + } + return err } } diff --git a/states.go b/states.go index ebb19a9..eff83bd 100644 --- a/states.go +++ b/states.go @@ -6,10 +6,12 @@ import ( var MainState = neco.State{ Fn: func(u *neco.Update) error { - disp := neco.NewDispatcher(). + privateDisp := neco.NewDispatcher(). HandleCommand(commandMe, handleMe). HandleCommand(commandHelp, handleHelp). HandleCommand(commandSay, handleSay) + disp := neco.NewDispatcher(). + HandleFilter(neco.IsPrivate, privateDisp.Run) return disp.Run(u) }, diff --git a/types.go b/types.go index c2986c6..9343927 100644 --- a/types.go +++ b/types.go @@ -9,11 +9,13 @@ import ( var _ tongo.Collectable = &User{} type User struct { - tongo.Item + tongo.Item `bson:",inline"` Username string FirstName string + LastName string ID int64 - KarmaOffser int + KarmaOffset int + LastMessage time.Time } func (User) Coll() string { return "users" }