From 703ea27cdb68702b889dba1eaf908e3e0064451a Mon Sep 17 00:00:00 2001 From: Vladimir Hodakov Date: Fri, 1 Dec 2017 10:55:18 +0400 Subject: [PATCH] Academic access level, can see other profiles --- lib/router/private_request.go | 10 ++++++++- lib/talkers/help.go | 2 ++ lib/users/getters.go | 4 ++++ lib/users/responders.go | 24 ++++++++++++++++++++++ lib/users/users.go | 2 +- lib/users/usersinterface/usersinterface.go | 1 + lib/welcomer/notifications.go | 24 ++++++++++++++++++++-- 7 files changed, 63 insertions(+), 4 deletions(-) diff --git a/lib/router/private_request.go b/lib/router/private_request.go index 0d7def1..1089462 100644 --- a/lib/router/private_request.go +++ b/lib/router/private_request.go @@ -16,6 +16,7 @@ func (r *Router) routePrivateRequest(update *tgbotapi.Update, playerRaw *dbmappi var pokedexMsg = regexp.MustCompile("/pokede(x|ks)\\d?\\z") var pokememeInfoMsg = regexp.MustCompile("/pk(\\d+)") var usersMsg = regexp.MustCompile("/users(\\d+|)\\z") + var profileMsg = regexp.MustCompile("/profile(\\d+)\\z") var squadInfoMsg = regexp.MustCompile("/show_squad(\\d+)\\z") var orderSendMsg = regexp.MustCompile("/send_order(\\d+)\\z") @@ -128,11 +129,18 @@ func (r *Router) routePrivateRequest(update *tgbotapi.Update, playerRaw *dbmappi return c.Talkers.AnyMessageUnauthorized(update) case usersMsg.MatchString(text): - if c.Users.PlayerBetterThan(playerRaw, "admin") { + if c.Users.PlayerBetterThan(playerRaw, "academic") { return c.Users.UsersList(update) } return c.Talkers.AnyMessageUnauthorized(update) + + case profileMsg.MatchString(text): + if c.Users.PlayerBetterThan(playerRaw, "academic") { + return c.Users.ForeignProfileMessage(update) + } + + return c.Talkers.AnyMessageUnauthorized(update) case update.Message.Command() == "squad_add_user": return c.Squader.AddUserToSquad(update, playerRaw) diff --git a/lib/talkers/help.go b/lib/talkers/help.go index 9965ac0..996f982 100644 --- a/lib/talkers/help.go +++ b/lib/talkers/help.go @@ -25,6 +25,8 @@ func (t *Talkers) HelpMessage(update *tgbotapi.Update, playerRaw *dbmapping.Play message += "+ /pin _номера чатов_ _текст_ — отправить сообщение в чаты с номерами. Сообщение будет автоматичекси запинено. Пример: \"/pin 2,3,5 привет мир\". Внимание: между номерами чатов ставятся запятые без пробелов! Всё, что идёт после второго пробела в команде — сообщение\n" message += "+ /pin\\_all _текст_ — отправить сообщение во все группы, где находится бот. Сообщение будет автоматически запинено.\n" message += "+ /orders — просмотреть приказы на атаку\n" + } + if c.Users.PlayerBetterThan(playerRaw, "academic") { message += "+ /users — просмотреть зарегистрированных пользователей бота\n" } message += "+ /help – выводит данное сообщение\n" diff --git a/lib/users/getters.go b/lib/users/getters.go index ff7b8c3..13ee014 100644 --- a/lib/users/getters.go +++ b/lib/users/getters.go @@ -72,6 +72,10 @@ func (u *Users) PlayerBetterThan(playerRaw *dbmapping.Player, powerLevel string) if powerLevel != "owner" { isBetter = true } + case "academic": + if powerLevel != "ownder" && powerLevel != "admin" { + isBetter = true + } default: isBetter = false } diff --git a/lib/users/responders.go b/lib/users/responders.go index 5c62722..0662d8e 100644 --- a/lib/users/responders.go +++ b/lib/users/responders.go @@ -15,6 +15,28 @@ func (u *Users) FormatUsername(userName string) string { return strings.Replace(userName, "_", "\\_", -1) } +// ForeignProfileMessage shows profile of another user +func (u *Users) ForeignProfileMessage(update *tgbotapi.Update) string { + userNum := strings.TrimPrefix(update.Message.Command(), "profile") + userID, err := strconv.Atoi(userNum) + if err != nil { + c.Log.Error(err.Error()) + return "fail" + } + + playerRaw, ok := u.GetPlayerByID(userID) + if !ok { + return "fail" + } + + _, ok = u.GetProfile(playerRaw.ID) + if !ok { + return c.Talkers.BotError(update) + } + + return u.ProfileMessage(update, &playerRaw) +} + // ProfileMessage shows current player's profile func (u *Users) ProfileMessage(update *tgbotapi.Update, playerRaw *dbmapping.Player) string { profileRaw, ok := u.GetProfile(playerRaw.ID) @@ -94,6 +116,8 @@ func (u *Users) ProfileMessage(update *tgbotapi.Update, playerRaw *dbmapping.Pla message += "\n\nСтатус в боте: _владелец_" } else if playerRaw.Status == "admin" { message += "\n\nСтатус в боте: _администратор_" + } else if playerRaw.Status == "academic" { + message += "\n\nСтатус в боте: _академик_" } else { message += "\n\nСтатус в боте: _игрок_" } diff --git a/lib/users/users.go b/lib/users/users.go index 4da5393..5106e6a 100644 --- a/lib/users/users.go +++ b/lib/users/users.go @@ -98,7 +98,7 @@ func (u *Users) usersList(update *tgbotapi.Update, page int, usersArray []dbmapp if usersArray[i].Profile.TelegramNickname != "" { message += " (@" + u.FormatUsername(usersArray[i].Profile.TelegramNickname) + ")" } - message += "\n" + message += " /profile" + strconv.Itoa(usersArray[i].Player.ID) + "\n" message += "Telegram ID: " + strconv.Itoa(usersArray[i].Player.TelegramID) + "\n" message += "Последнее обновление: " + usersArray[i].Profile.CreatedAt.Format("02.01.2006 15:04:05") + "\n" } else { diff --git a/lib/users/usersinterface/usersinterface.go b/lib/users/usersinterface/usersinterface.go index c6cb5bf..431d2b4 100644 --- a/lib/users/usersinterface/usersinterface.go +++ b/lib/users/usersinterface/usersinterface.go @@ -19,6 +19,7 @@ type UsersInterface interface { GetPlayerByID(playerID int) (dbmapping.Player, bool) PlayerBetterThan(playerRaw *dbmapping.Player, powerLevel string) bool + ForeignProfileMessage(update *tgbotapi.Update) string FormatUsername(userName string) string ProfileMessage(update *tgbotapi.Update, playerRaw *dbmapping.Player) string UsersList(update *tgbotapi.Update) string diff --git a/lib/welcomer/notifications.go b/lib/welcomer/notifications.go index 07eea11..ba15e2a 100644 --- a/lib/welcomer/notifications.go +++ b/lib/welcomer/notifications.go @@ -15,8 +15,18 @@ func (w *Welcomer) alertUserWithoutProfile(update *tgbotapi.Update, newUser *tgb return "fail" } + userName := "" + if newUser.UserName != "" { + userName += "@" + newUser.UserName + } else { + userName += newUser.FirstName + if newUser.LastName != "" { + userName += " " + newUser.LastName + } + } + message := "*Новый вход пользователя без профиля в чат с ботом!*\n" - message += "В чат _" + chat.Name + "_ вошёл некто @" + newUser.UserName + message += "В чат _" + chat.Name + "_ вошёл некто " + c.Users.FormatUsername(userName) message += ". Он получил уведомление о том, что ему нужно создать профиль в боте." msg := tgbotapi.NewMessage(alertGroupID, message) @@ -34,8 +44,18 @@ func (w *Welcomer) alertSpyUser(update *tgbotapi.Update, newUser *tgbotapi.User) return "fail" } + userName := "" + if newUser.UserName != "" { + userName += "@" + newUser.UserName + } else { + userName += newUser.FirstName + if newUser.LastName != "" { + userName += " " + newUser.LastName + } + } + message := "*Шпион в деле!*\n" - message += "В чат _" + chat.Name + "_ вошёл некто @" + newUser.UserName + message += "В чат _" + chat.Name + "_ вошёл некто " + c.Users.FormatUsername(userName) message += ". У него профиль другой лиги. Ждём обновлений." msg := tgbotapi.NewMessage(alertGroupID, message)