diff --git a/api.go b/api.go index b473c38..f56267f 100644 --- a/api.go +++ b/api.go @@ -1176,6 +1176,7 @@ func (app *appContext) GetUsers(gc *gin.Context) { } if tgUser, ok := app.storage.telegram[jfUser.ID]; ok { user.Telegram = tgUser.Username + user.NotifyThroughTelegram = tgUser.Contact } resp.UserList[i] = user i++ @@ -1991,6 +1992,42 @@ func (app *appContext) TelegramAddUser(gc *gin.Context) { respondBool(200, true, gc) } +// @Summary Sets whether to notify a user through telegram or not. +// @Produce json +// @Param telegramNotifyDTO body telegramNotifyDTO true "User's Jellyfin ID and whether or not to notify then through Telegram." +// @Success 200 {object} boolResponse +// @Success 400 {object} boolResponse +// @Success 500 {object} boolResponse +// @Router /users/telegram/notify [post] +// @Security Bearer +// @tags Other +func (app *appContext) TelegramSetNotify(gc *gin.Context) { + var req telegramNotifyDTO + gc.BindJSON(&req) + if req.ID == "" { + respondBool(400, false, gc) + return + } + if tgUser, ok := app.storage.telegram[req.ID]; ok { + tgUser.Contact = req.Enabled + app.storage.telegram[req.ID] = tgUser + if err := app.storage.storeTelegramUsers(); err != nil { + respondBool(500, false, gc) + app.err.Printf("Telegram: Failed to store users: %v", err) + return + } + respondBool(200, true, gc) + msg := "" + if !req.Enabled { + msg = "not" + } + app.debug.Printf("Telegram: User \"%s\" will %s be notified through Telegram.", tgUser.Username, msg) + return + } + app.err.Printf("Telegram: User \"%s\" does not have a telegram account registered.", req.ID) + respondBool(400, false, gc) +} + // @Summary Returns true/false on whether or not a telegram PIN was verified. Requires bearer auth. // @Produce json // @Success 200 {object} boolResponse diff --git a/css/base.css b/css/base.css index 976062b..4b1e040 100644 --- a/css/base.css +++ b/css/base.css @@ -171,6 +171,12 @@ div.card:contains(section.banner.footer) { margin: 0.5rem; } +p.sm, +span.sm { + font-size: 0.75rem; +} + + .col.sm { margin: .25rem; } diff --git a/lang/admin/en-us.json b/lang/admin/en-us.json index 533ac1d..8fb42d1 100644 --- a/lang/admin/en-us.json +++ b/lang/admin/en-us.json @@ -54,6 +54,7 @@ "reset": "Reset", "edit": "Edit", "donate": "Donate", + "contactThrough": "Contact through:", "extendExpiry": "Extend expiry", "customizeMessages": "Customize Messages", "customizeMessagesDescription": "If you don't want to use jfa-go's message templates, you can create your own using Markdown.", diff --git a/models.go b/models.go index e7adc17..772238b 100644 --- a/models.go +++ b/models.go @@ -122,14 +122,15 @@ type deleteInviteDTO struct { } type respUser struct { - ID string `json:"id" example:"fdgsdfg45534fa"` // userID of user - Name string `json:"name" example:"jeff"` // Username of user - Email string `json:"email,omitempty" example:"jeff@jellyf.in"` // Email address of user (if available) - LastActive int64 `json:"last_active" example:"1617737207510"` // Time of last activity on Jellyfin - Admin bool `json:"admin" example:"false"` // Whether or not the user is Administrator - Expiry int64 `json:"expiry" example:"1617737207510"` // Expiry time of user as Epoch/Unix time. - Disabled bool `json:"disabled"` // Whether or not the user is disabled. - Telegram string `json:"telegram"` // Telegram username (if known) + ID string `json:"id" example:"fdgsdfg45534fa"` // userID of user + Name string `json:"name" example:"jeff"` // Username of user + Email string `json:"email,omitempty" example:"jeff@jellyf.in"` // Email address of user (if available) + LastActive int64 `json:"last_active" example:"1617737207510"` // Time of last activity on Jellyfin + Admin bool `json:"admin" example:"false"` // Whether or not the user is Administrator + Expiry int64 `json:"expiry" example:"1617737207510"` // Expiry time of user as Epoch/Unix time. + Disabled bool `json:"disabled"` // Whether or not the user is disabled. + Telegram string `json:"telegram"` // Telegram username (if known) + NotifyThroughTelegram bool `json:"notify_telegram"` } type getUsersDTO struct { @@ -247,3 +248,8 @@ type telegramSetDTO struct { Token string `json:"token" example:"A1-B2-3C"` ID string `json:"id"` // Jellyfin ID of user. } + +type telegramNotifyDTO struct { + ID string `json:"id"` + Enabled bool `json:"enabled"` +} diff --git a/router.go b/router.go index 2af7aeb..355fb3f 100644 --- a/router.go +++ b/router.go @@ -162,6 +162,7 @@ func (app *appContext) loadRoutes(router *gin.Engine) { api.GET(p+"/telegram/pin", app.TelegramGetPin) api.GET(p+"/telegram/verified/:pin", app.TelegramVerified) api.POST(p+"/users/telegram", app.TelegramAddUser) + api.POST(p+"/users/telegram/notify", app.TelegramSetNotify) } if app.config.Section("ombi").Key("enabled").MustBool(false) { api.GET(p+"/ombi/users", app.OmbiUsers) diff --git a/ts/modules/accounts.ts b/ts/modules/accounts.ts index 4201895..e383b4a 100644 --- a/ts/modules/accounts.ts +++ b/ts/modules/accounts.ts @@ -12,6 +12,7 @@ interface User { disabled: boolean; expiry: number; telegram: string; + notify_telegram: boolean; } interface getPinResponse { @@ -30,6 +31,7 @@ class user implements User { private _emailEditButton: HTMLElement; private _telegram: HTMLTableDataCellElement; private _telegramUsername: string; + private _notifyTelegram: boolean; private _expiry: HTMLTableDataCellElement; private _expiryUnix: number; private _lastActive: HTMLTableDataCellElement; @@ -88,10 +90,80 @@ class user implements User { this._telegram.innerHTML = `Add`; (this._telegram.querySelector("span") as HTMLSpanElement).onclick = this._addTelegram; } else { - this._telegram.innerHTML = `@${u}`; + this._telegram.innerHTML = ` + @${u} + +