mirror of
https://github.com/hrfee/jfa-go.git
synced 2024-12-23 01:20:11 +00:00
invites: allow notification by discord/telegram/matrix
also added migration as this required changing the indexing of notify preferences from email addresses to Jellyfin IDs.
This commit is contained in:
parent
3730775018
commit
e7ca335d83
45
api.go
45
api.go
@ -129,11 +129,19 @@ func (app *appContext) checkInvites() {
|
|||||||
msg, err := app.email.constructExpiry(code, data, app, false)
|
msg, err := app.email.constructExpiry(code, data, app, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.err.Printf("%s: Failed to construct expiry notification: %v", code, err)
|
app.err.Printf("%s: Failed to construct expiry notification: %v", code, err)
|
||||||
} else if err := app.email.send(msg, addr); err != nil {
|
} else {
|
||||||
|
// Check whether notify "address" is an email address of Jellyfin ID
|
||||||
|
if strings.Contains(addr, "@") {
|
||||||
|
err = app.email.send(msg, addr)
|
||||||
|
} else {
|
||||||
|
err = app.sendByID(msg, addr)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
app.err.Printf("%s: Failed to send expiry notification: %v", code, err)
|
app.err.Printf("%s: Failed to send expiry notification: %v", code, err)
|
||||||
} else {
|
} else {
|
||||||
app.info.Printf("Sent expiry notification to %s", addr)
|
app.info.Printf("Sent expiry notification to %s", addr)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}(address)
|
}(address)
|
||||||
}
|
}
|
||||||
wait.Wait()
|
wait.Wait()
|
||||||
@ -171,11 +179,19 @@ func (app *appContext) checkInvite(code string, used bool, username string) bool
|
|||||||
msg, err := app.email.constructExpiry(code, inv, app, false)
|
msg, err := app.email.constructExpiry(code, inv, app, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.err.Printf("%s: Failed to construct expiry notification: %v", code, err)
|
app.err.Printf("%s: Failed to construct expiry notification: %v", code, err)
|
||||||
} else if err := app.email.send(msg, addr); err != nil {
|
} else {
|
||||||
|
// Check whether notify "address" is an email address of Jellyfin ID
|
||||||
|
if strings.Contains(addr, "@") {
|
||||||
|
err = app.email.send(msg, addr)
|
||||||
|
} else {
|
||||||
|
err = app.sendByID(msg, addr)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
app.err.Printf("%s: Failed to send expiry notification: %v", code, err)
|
app.err.Printf("%s: Failed to send expiry notification: %v", code, err)
|
||||||
} else {
|
} else {
|
||||||
app.info.Printf("Sent expiry notification to %s", addr)
|
app.info.Printf("Sent expiry notification to %s", addr)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}(address)
|
}(address)
|
||||||
}
|
}
|
||||||
wait.Wait()
|
wait.Wait()
|
||||||
@ -470,10 +486,18 @@ func (app *appContext) newUser(req newUserDTO, confirmed bool) (f errorFunc, suc
|
|||||||
msg, err := app.email.constructCreated(req.Code, req.Username, req.Email, invite, app, false)
|
msg, err := app.email.constructCreated(req.Code, req.Username, req.Email, invite, app, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
app.err.Printf("%s: Failed to construct user creation notification: %v", req.Code, err)
|
app.err.Printf("%s: Failed to construct user creation notification: %v", req.Code, err)
|
||||||
} else if err := app.email.send(msg, address); err != nil {
|
} else {
|
||||||
|
// Check whether notify "address" is an email address of Jellyfin ID
|
||||||
|
if strings.Contains(address, "@") {
|
||||||
|
err = app.email.send(msg, address)
|
||||||
|
} else {
|
||||||
|
err = app.sendByID(msg, address)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
app.err.Printf("%s: Failed to send user creation notification: %v", req.Code, err)
|
app.err.Printf("%s: Failed to send user creation notification: %v", req.Code, err)
|
||||||
} else {
|
} else {
|
||||||
app.info.Printf("%s: Sent user creation notification to %v", req.Code, address)
|
app.info.Printf("Sent user creation notification to %s", address)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@ -1340,15 +1364,16 @@ func (app *appContext) SetNotify(gc *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
var address string
|
var address string
|
||||||
if app.config.Section("ui").Key("jellyfin_login").MustBool(false) {
|
jellyfinLogin := app.config.Section("ui").Key("jellyfin_login").MustBool(false)
|
||||||
addr, ok := app.storage.emails[gc.GetString("jfId")]
|
if jellyfinLogin {
|
||||||
if !ok {
|
var addressAvailable bool = app.getAddressOrName(gc.GetString("jfId")) != ""
|
||||||
app.err.Printf("%s: Couldn't find email address. Make sure it's set", code)
|
if !addressAvailable {
|
||||||
|
app.err.Printf("%s: Couldn't find contact method for admin. Make sure one is set.", code)
|
||||||
app.debug.Printf("%s: User ID \"%s\"", code, gc.GetString("jfId"))
|
app.debug.Printf("%s: User ID \"%s\"", code, gc.GetString("jfId"))
|
||||||
respond(500, "Missing user email", gc)
|
respond(500, "Missing user contact method", gc)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
address = addr.Addr
|
address = gc.GetString("jfId")
|
||||||
} else {
|
} else {
|
||||||
address = app.config.Section("ui").Key("email").String()
|
address = app.config.Section("ui").Key("email").String()
|
||||||
}
|
}
|
||||||
|
@ -12,14 +12,14 @@
|
|||||||
"title": "Notice: User created",
|
"title": "Notice: User created",
|
||||||
"aUserWasCreated": "A user was created using code {code}.",
|
"aUserWasCreated": "A user was created using code {code}.",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"notificationNotice": "Note: Notification emails can be toggled on the admin dashboard."
|
"notificationNotice": "Note: Notification messages can be toggled on the admin dashboard."
|
||||||
},
|
},
|
||||||
"inviteExpiry": {
|
"inviteExpiry": {
|
||||||
"name": "Invite expiry",
|
"name": "Invite expiry",
|
||||||
"title": "Notice: Invite expired",
|
"title": "Notice: Invite expired",
|
||||||
"inviteExpired": "Invite expired.",
|
"inviteExpired": "Invite expired.",
|
||||||
"expiredAt": "Code {code} expired at {time}.",
|
"expiredAt": "Code {code} expired at {time}.",
|
||||||
"notificationNotice": "Note: Notification emails can be toggled on the admin dashboard."
|
"notificationNotice": "Note: Notification messages can be toggled on the admin dashboard."
|
||||||
},
|
},
|
||||||
"passwordReset": {
|
"passwordReset": {
|
||||||
"name": "Password reset",
|
"name": "Password reset",
|
||||||
|
@ -13,6 +13,7 @@ func runMigrations(app *appContext) {
|
|||||||
migrateProfiles(app)
|
migrateProfiles(app)
|
||||||
migrateBootstrap(app)
|
migrateBootstrap(app)
|
||||||
migrateEmailStorage(app)
|
migrateEmailStorage(app)
|
||||||
|
migrateNotificationMethods(app)
|
||||||
// migrateHyphens(app)
|
// migrateHyphens(app)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,6 +124,40 @@ func migrateEmailStorage(app *appContext) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pre-0.3.10, Admin notifications for invites were indexed by and only sent to email addresses. Now, when Jellyfin Login is enabled, They are indexed by the admin's Jellyfin ID, and send by any method enabled for them. This migrates storage to that format.
|
||||||
|
func migrateNotificationMethods(app *appContext) error {
|
||||||
|
if !app.config.Section("ui").Key("jellyfin_login").MustBool(false) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
changes := false
|
||||||
|
for code, invite := range app.storage.invites {
|
||||||
|
if invite.Notify == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for address, notifyPrefs := range invite.Notify {
|
||||||
|
if !strings.Contains(address, "@") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for id, email := range app.storage.emails {
|
||||||
|
if email.Addr == address {
|
||||||
|
invite.Notify[id] = notifyPrefs
|
||||||
|
delete(invite.Notify, address)
|
||||||
|
changes = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if changes {
|
||||||
|
app.storage.invites[code] = invite
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if changes {
|
||||||
|
app.info.Printf("Migrated to modified invite storage format.")
|
||||||
|
return app.storage.storeInvites()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Migrate between hyphenated & non-hyphenated user IDs. Doesn't seem to happen anymore, so disabled.
|
// Migrate between hyphenated & non-hyphenated user IDs. Doesn't seem to happen anymore, so disabled.
|
||||||
// func migrateHyphens(app *appContext) {
|
// func migrateHyphens(app *appContext) {
|
||||||
// checkVersion := func(version string) int {
|
// checkVersion := func(version string) int {
|
||||||
|
Loading…
Reference in New Issue
Block a user