diff --git a/api-userpage.go b/api-userpage.go
index 2eaf22c..dce320f 100644
--- a/api-userpage.go
+++ b/api-userpage.go
@@ -14,7 +14,7 @@ import (
)
const (
- REFERRAL_EXPIRY_DAYS = 365
+ REFERRAL_EXPIRY_DAYS = 90
)
// @Summary Returns the logged-in user's Jellyfin ID & Username, and other details.
@@ -81,6 +81,25 @@ func (app *appContext) MyDetails(gc *gin.Context) {
}
}
+ if app.config.Section("user_page").Key("referrals").MustBool(false) {
+ // 1. Look for existing template bound to this Jellyfin ID
+ // If one exists, that means its just for us and so we
+ // can use it directly.
+ inv := Invite{}
+ err := app.storage.db.FindOne(&inv, badgerhold.Where("ReferrerJellyfinID").Eq(resp.Id))
+ if err == nil {
+ resp.HasReferrals = true
+ } else {
+ // 2. Look for a template matching the key found in the user storage
+ // Since this key is shared between users in a profile, we make a copy.
+ user, ok := app.storage.GetEmailsKey(gc.GetString("jfId"))
+ err = app.storage.db.Get(user.ReferralTemplateKey, &inv)
+ if ok && err == nil {
+ resp.HasReferrals = true
+ }
+ }
+ }
+
gc.JSON(200, resp)
}
@@ -685,6 +704,6 @@ func (app *appContext) GetMyReferral(gc *gin.Context) {
Code: inv.Code,
RemainingUses: inv.RemainingUses,
NoLimit: inv.NoLimit,
- Expiry: inv.ValidTill,
+ Expiry: inv.ValidTill.Unix(),
})
}
diff --git a/html/user.html b/html/user.html
index e073cf2..5753fc1 100644
--- a/html/user.html
+++ b/html/user.html
@@ -24,6 +24,7 @@
window.matrixRequired = {{ .matrixRequired }};
window.matrixUserID = "{{ .matrixUser }}";
window.validationStrings = JSON.parse({{ .validationStrings }});
+ window.referralsEnabled = {{ .referralsEnabled }};
{{ template "header.html" . }}
{{ .strings.myAccount }}
@@ -150,6 +151,20 @@
+ {{ if .referralsEnabled }}
+
+
+
{{ .strings.referrals }}
+
+
+
+
+
+
+
+
+
+ {{ end }}
diff --git a/lang/admin/da-dk.json b/lang/admin/da-dk.json
index da0e967..b147dc0 100644
--- a/lang/admin/da-dk.json
+++ b/lang/admin/da-dk.json
@@ -79,7 +79,6 @@
"inviteUsersCreated": "Oprettet brugere",
"inviteNoProfile": "Ingen Profil",
"inviteDateCreated": "Oprettet",
- "inviteRemainingUses": "Resterende anvendelser",
"inviteNoInvites": "Ingen",
"inviteExpiresInTime": "Udløber om {n}",
"notifyEvent": "Meddel den:",
diff --git a/lang/admin/de-de.json b/lang/admin/de-de.json
index bbcf259..79fb2aa 100644
--- a/lang/admin/de-de.json
+++ b/lang/admin/de-de.json
@@ -53,7 +53,6 @@
"inviteUsersCreated": "Erstellte Benutzer",
"inviteNoProfile": "Kein Profil",
"inviteDateCreated": "Erstellt",
- "inviteRemainingUses": "Verbleibende Verwendungen",
"inviteNoInvites": "Keine",
"inviteExpiresInTime": "Läuft in {n} ab",
"notifyEvent": "Benachrichtigen bei:",
diff --git a/lang/admin/el-gr.json b/lang/admin/el-gr.json
index e84f19b..1a2e369 100644
--- a/lang/admin/el-gr.json
+++ b/lang/admin/el-gr.json
@@ -56,7 +56,6 @@
"inviteUsersCreated": "Δημιουργηθέντες χρήστες",
"inviteNoProfile": "Κανένα Προφίλ",
"inviteDateCreated": "Δημιουργηθέντα",
- "inviteRemainingUses": "Εναπομείναντες χρήσεις",
"inviteNoInvites": "Καμία",
"inviteExpiresInTime": "Λήγει σε {n}",
"notifyEvent": "Ενημέρωση όταν:",
diff --git a/lang/admin/en-gb.json b/lang/admin/en-gb.json
index d716caa..cee85b9 100644
--- a/lang/admin/en-gb.json
+++ b/lang/admin/en-gb.json
@@ -124,7 +124,6 @@
"addProfileStoreHomescreenLayout": "Store homescreen layout",
"inviteNoUsersCreated": "None yet!",
"inviteUsersCreated": "Created users",
- "inviteRemainingUses": "Remaining uses",
"inviteNoInvites": "None",
"inviteExpiresInTime": "Expires in {n}",
"notifyEvent": "Notify on:",
diff --git a/lang/admin/en-us.json b/lang/admin/en-us.json
index 57efcf2..2e3169c 100644
--- a/lang/admin/en-us.json
+++ b/lang/admin/en-us.json
@@ -95,7 +95,6 @@
"inviteUsersCreated": "Created users",
"inviteNoProfile": "No Profile",
"inviteDateCreated": "Created",
- "inviteRemainingUses": "Remaining uses",
"inviteNoInvites": "None",
"inviteExpiresInTime": "Expires in {n}",
"notifyEvent": "Notify on:",
@@ -224,4 +223,4 @@
"plural": "Extended expiry for {n} users."
}
}
-}
+}
\ No newline at end of file
diff --git a/lang/admin/es-es.json b/lang/admin/es-es.json
index 1506e76..536022d 100644
--- a/lang/admin/es-es.json
+++ b/lang/admin/es-es.json
@@ -75,7 +75,6 @@
"inviteUsersCreated": "Usuarios creados",
"inviteNoProfile": "Sin perfil",
"inviteDateCreated": "Creado",
- "inviteRemainingUses": "Usos restantes",
"inviteNoInvites": "Ninguno",
"inviteExpiresInTime": "Caduca en {n}",
"notifyEvent": "Notificar en:",
diff --git a/lang/admin/fr-fr.json b/lang/admin/fr-fr.json
index cb8eb5a..01a1b54 100644
--- a/lang/admin/fr-fr.json
+++ b/lang/admin/fr-fr.json
@@ -55,7 +55,6 @@
"inviteUsersCreated": "Utilisateurs créés",
"inviteNoProfile": "Aucun profil",
"inviteDateCreated": "Créer",
- "inviteRemainingUses": "Utilisations restantes",
"inviteNoInvites": "Aucune",
"inviteExpiresInTime": "Expires dans {n}",
"notifyEvent": "Notifier sur :",
diff --git a/lang/admin/hu-hu.json b/lang/admin/hu-hu.json
index 4161ef0..dca6069 100644
--- a/lang/admin/hu-hu.json
+++ b/lang/admin/hu-hu.json
@@ -87,7 +87,6 @@
"inviteUsersCreated": "",
"inviteNoProfile": "",
"inviteDateCreated": "",
- "inviteRemainingUses": "",
"inviteNoInvites": "",
"inviteExpiresInTime": "",
"notifyEvent": "",
diff --git a/lang/admin/id-id.json b/lang/admin/id-id.json
index 5957396..365ed65 100644
--- a/lang/admin/id-id.json
+++ b/lang/admin/id-id.json
@@ -56,7 +56,6 @@
"inviteUsersCreated": "Pengguna yang telah dibuat",
"inviteNoProfile": "Tidak ada profil",
"inviteDateCreated": "Dibuat",
- "inviteRemainingUses": "Penggunaan yang tersisa",
"inviteNoInvites": "Tidak ada",
"inviteExpiresInTime": "Kadaluarsa dalam {n}",
"notifyEvent": "Beritahu pada:",
diff --git a/lang/admin/nl-nl.json b/lang/admin/nl-nl.json
index 46b9452..a8e9172 100644
--- a/lang/admin/nl-nl.json
+++ b/lang/admin/nl-nl.json
@@ -53,7 +53,6 @@
"inviteUsersCreated": "Aangemaakte gebruikers",
"inviteNoProfile": "Geen profiel",
"inviteDateCreated": "Aangemaakt",
- "inviteRemainingUses": "Resterend aantal keer te gebruiken",
"inviteNoInvites": "Geen",
"inviteExpiresInTime": "Verloopt over {n}",
"notifyEvent": "Meldingen:",
diff --git a/lang/admin/pl-pl.json b/lang/admin/pl-pl.json
index 6b1bdc2..fddce21 100644
--- a/lang/admin/pl-pl.json
+++ b/lang/admin/pl-pl.json
@@ -87,7 +87,6 @@
"inviteUsersCreated": "",
"inviteNoProfile": "",
"inviteDateCreated": "Utworzone",
- "inviteRemainingUses": "",
"inviteNoInvites": "",
"inviteExpiresInTime": "",
"notifyEvent": "",
diff --git a/lang/admin/pt-br.json b/lang/admin/pt-br.json
index 0310937..37b63eb 100644
--- a/lang/admin/pt-br.json
+++ b/lang/admin/pt-br.json
@@ -54,7 +54,6 @@
"inviteUsersCreated": "Usuários criado",
"inviteNoProfile": "Sem Perfil",
"inviteDateCreated": "Criado",
- "inviteRemainingUses": "Uso restantes",
"inviteNoInvites": "Nenhum",
"inviteExpiresInTime": "Expira em {n}",
"notifyEvent": "Notificar em:",
diff --git a/lang/admin/sv-se.json b/lang/admin/sv-se.json
index 1f7e1f1..823167c 100644
--- a/lang/admin/sv-se.json
+++ b/lang/admin/sv-se.json
@@ -65,7 +65,6 @@
"inviteUsersCreated": "Skapade användare",
"inviteNoProfile": "Ingen profil",
"inviteDateCreated": "Skapad",
- "inviteRemainingUses": "Återstående användningar",
"inviteNoInvites": "Ingen",
"inviteExpiresInTime": "Går ut om {n}",
"notifyEvent": "Meddela den:",
diff --git a/lang/admin/vi-vn.json b/lang/admin/vi-vn.json
index 7dd7e56..3ad6ba2 100644
--- a/lang/admin/vi-vn.json
+++ b/lang/admin/vi-vn.json
@@ -86,7 +86,6 @@
"inviteUsersCreated": "Người dùng đã tạo",
"inviteNoProfile": "Không có Tài khoản mẫu",
"inviteDateCreated": "Tạo",
- "inviteRemainingUses": "Số lần sử dụng còn lại",
"inviteNoInvites": "Không có",
"inviteExpiresInTime": "Hết hạn trong {n}",
"notifyEvent": "Thông báo khi:",
diff --git a/lang/admin/zh-hans.json b/lang/admin/zh-hans.json
index 6190c8f..0309721 100644
--- a/lang/admin/zh-hans.json
+++ b/lang/admin/zh-hans.json
@@ -80,7 +80,6 @@
"inviteUsersCreated": "已创建的用户",
"inviteNoProfile": "没有个人资料",
"inviteDateCreated": "已创建",
- "inviteRemainingUses": "剩余使用次数",
"inviteNoInvites": "无",
"inviteExpiresInTime": "在 {n} 到期",
"notifyEvent": "通知:",
diff --git a/lang/admin/zh-hant.json b/lang/admin/zh-hant.json
index 5546e09..2cbf43b 100644
--- a/lang/admin/zh-hant.json
+++ b/lang/admin/zh-hant.json
@@ -87,7 +87,6 @@
"inviteUsersCreated": "創建的帳戶",
"inviteNoProfile": "無資料",
"inviteDateCreated": "已創建",
- "inviteRemainingUses": "剩餘使用次數",
"inviteNoInvites": "無",
"inviteExpiresInTime": "在 {n} 到期",
"notifyEvent": "通知:",
diff --git a/lang/common/da-dk.json b/lang/common/da-dk.json
index ce3fb1d..3a196a7 100644
--- a/lang/common/da-dk.json
+++ b/lang/common/da-dk.json
@@ -35,7 +35,8 @@
"expiry": "Udløb",
"add": "Tilføj",
"edit": "Rediger",
- "delete": "Slet"
+ "delete": "Slet",
+ "inviteRemainingUses": "Resterende anvendelser"
},
"notifications": {
"errorLoginBlank": "Brugernavnet og/eller adgangskoden blev efterladt tomme.",
diff --git a/lang/common/de-de.json b/lang/common/de-de.json
index 6459eef..024a4de 100644
--- a/lang/common/de-de.json
+++ b/lang/common/de-de.json
@@ -35,7 +35,8 @@
"expiry": "Ablaufdatum",
"add": "Hinzufügen",
"edit": "Bearbeiten",
- "delete": "Löschen"
+ "delete": "Löschen",
+ "inviteRemainingUses": "Verbleibende Verwendungen"
},
"notifications": {
"errorLoginBlank": "Der Benutzername und/oder das Passwort wurden nicht ausgefüllt.",
diff --git a/lang/common/el-gr.json b/lang/common/el-gr.json
index 3c0c5c9..8a06da8 100644
--- a/lang/common/el-gr.json
+++ b/lang/common/el-gr.json
@@ -25,7 +25,8 @@
"disable": "Απενεργοποίηση",
"expiry": "Λήξη",
"edit": "Επεξεργασία",
- "delete": "Διαγραφή"
+ "delete": "Διαγραφή",
+ "inviteRemainingUses": "Εναπομείναντες χρήσεις"
},
"notifications": {
"errorLoginBlank": "Το όνομα χρήστη και/ή ο κωδικός ήταν κενά.",
diff --git a/lang/common/en-gb.json b/lang/common/en-gb.json
index ff6147b..6283091 100644
--- a/lang/common/en-gb.json
+++ b/lang/common/en-gb.json
@@ -35,7 +35,8 @@
"expiry": "Expiry",
"add": "Add",
"edit": "Edit",
- "delete": "Delete"
+ "delete": "Delete",
+ "inviteRemainingUses": "Remaining uses"
},
"notifications": {
"errorLoginBlank": "The username and/or password was left blank.",
diff --git a/lang/common/en-us.json b/lang/common/en-us.json
index 1c72c34..57e4046 100644
--- a/lang/common/en-us.json
+++ b/lang/common/en-us.json
@@ -40,7 +40,8 @@
"edit": "Edit",
"delete": "Delete",
"myAccount": "My Account",
- "referrals": "Referrals"
+ "referrals": "Referrals",
+ "inviteRemainingUses": "Remaining uses"
},
"notifications": {
"errorLoginBlank": "The username and/or password were left blank.",
@@ -63,4 +64,4 @@
"plural": "{n} Days"
}
}
-}
+}
\ No newline at end of file
diff --git a/lang/common/es-es.json b/lang/common/es-es.json
index f0bec53..f28e38d 100644
--- a/lang/common/es-es.json
+++ b/lang/common/es-es.json
@@ -35,7 +35,8 @@
"expiry": "Expiración",
"add": "Agregar",
"edit": "Editar",
- "delete": "Eliminar"
+ "delete": "Eliminar",
+ "inviteRemainingUses": "Usos restantes"
},
"notifications": {
"errorLoginBlank": "El nombre de usuario y/o la contraseña se dejaron en blanco.",
diff --git a/lang/common/fr-fr.json b/lang/common/fr-fr.json
index d7dfd5c..78abba9 100644
--- a/lang/common/fr-fr.json
+++ b/lang/common/fr-fr.json
@@ -35,7 +35,8 @@
"expiry": "Expiration",
"add": "Ajouter",
"edit": "Éditer",
- "delete": "Effacer"
+ "delete": "Effacer",
+ "inviteRemainingUses": "Utilisations restantes"
},
"notifications": {
"errorLoginBlank": "Le nom d'utilisateur et/ou le mot de passe sont vides.",
diff --git a/lang/common/id-id.json b/lang/common/id-id.json
index e8f4e9b..c6b10b5 100644
--- a/lang/common/id-id.json
+++ b/lang/common/id-id.json
@@ -19,7 +19,8 @@
"login": "Masuk",
"logout": "Keluar",
"edit": "Edit",
- "delete": "Hapus"
+ "delete": "Hapus",
+ "inviteRemainingUses": "Penggunaan yang tersisa"
},
"notifications": {
"errorLoginBlank": "Nama pengguna dan / atau sandi kosong.",
diff --git a/lang/common/it-it.json b/lang/common/it-it.json
index 58d5021..9a5db2d 100644
--- a/lang/common/it-it.json
+++ b/lang/common/it-it.json
@@ -28,4 +28,4 @@
},
"notifications": {},
"quantityStrings": {}
-}
+}
\ No newline at end of file
diff --git a/lang/common/nds.json b/lang/common/nds.json
new file mode 100644
index 0000000..a7f6836
--- /dev/null
+++ b/lang/common/nds.json
@@ -0,0 +1,8 @@
+{
+ "meta": {
+ "name": "Nedderdütsch (NDS)"
+ },
+ "strings": {},
+ "notifications": {},
+ "quantityStrings": {}
+}
\ No newline at end of file
diff --git a/lang/common/nl-nl.json b/lang/common/nl-nl.json
index 0591de1..cb5213d 100644
--- a/lang/common/nl-nl.json
+++ b/lang/common/nl-nl.json
@@ -35,7 +35,8 @@
"expiry": "Verloop",
"add": "Voeg toe",
"edit": "Bewerken",
- "delete": "Verwijderen"
+ "delete": "Verwijderen",
+ "inviteRemainingUses": "Resterend aantal keer te gebruiken"
},
"notifications": {
"errorLoginBlank": "De gebruikersnaam en/of wachtwoord is leeg.",
diff --git a/lang/common/pt-br.json b/lang/common/pt-br.json
index b7953fa..006bbb6 100644
--- a/lang/common/pt-br.json
+++ b/lang/common/pt-br.json
@@ -35,7 +35,8 @@
"expiry": "Expira",
"add": "Adicionar",
"edit": "Editar",
- "delete": "Deletar"
+ "delete": "Deletar",
+ "inviteRemainingUses": "Uso restantes"
},
"notifications": {
"errorLoginBlank": "O nome de usuário e/ou senha foram deixados em branco.",
diff --git a/lang/common/sl-si.json b/lang/common/sl-si.json
index 95187bd..9ecaecd 100644
--- a/lang/common/sl-si.json
+++ b/lang/common/sl-si.json
@@ -28,4 +28,4 @@
},
"notifications": {},
"quantityStrings": {}
-}
+}
\ No newline at end of file
diff --git a/lang/common/sv-se.json b/lang/common/sv-se.json
index 0eb8b5f..ff602c8 100644
--- a/lang/common/sv-se.json
+++ b/lang/common/sv-se.json
@@ -22,7 +22,8 @@
"disabled": "Inaktiverad",
"expiry": "Löper ut",
"edit": "Redigera",
- "delete": "Radera"
+ "delete": "Radera",
+ "inviteRemainingUses": "Återstående användningar"
},
"notifications": {
"errorLoginBlank": "Användarnamnet och/eller lösenordet lämnades tomt.",
diff --git a/lang/common/vi-vn.json b/lang/common/vi-vn.json
index 3a8abbd..f4584ed 100644
--- a/lang/common/vi-vn.json
+++ b/lang/common/vi-vn.json
@@ -13,7 +13,8 @@
"expiry": "Hết hạn",
"add": "Thêm",
"edit": "Chỉnh sửa",
- "delete": "Xóa"
+ "delete": "Xóa",
+ "inviteRemainingUses": "Số lần sử dụng còn lại"
},
"notifications": {
"errorConnection": "Không thể kết nối với jfa-go.",
diff --git a/lang/common/zh-hans.json b/lang/common/zh-hans.json
index 2d12e74..faab5b4 100644
--- a/lang/common/zh-hans.json
+++ b/lang/common/zh-hans.json
@@ -35,7 +35,8 @@
"expiry": "到期",
"add": "添加",
"edit": "编辑",
- "delete": "删除"
+ "delete": "删除",
+ "inviteRemainingUses": "剩余使用次数"
},
"notifications": {
"errorLoginBlank": "用户名/密码留空。",
diff --git a/lang/common/zh-hant.json b/lang/common/zh-hant.json
index 8b0b42f..87c4409 100644
--- a/lang/common/zh-hant.json
+++ b/lang/common/zh-hant.json
@@ -35,7 +35,8 @@
"expiry": "到期",
"add": "添加",
"edit": "編輯",
- "delete": "刪除"
+ "delete": "刪除",
+ "inviteRemainingUses": "剩餘使用次數"
},
"notifications": {
"errorLoginBlank": "帳戶名稱和/或密碼留空。",
diff --git a/lang/email/it-it.json b/lang/email/it-it.json
index fe844bc..89b12b8 100644
--- a/lang/email/it-it.json
+++ b/lang/email/it-it.json
@@ -49,4 +49,4 @@
"clickBelow": "",
"confirmEmail": ""
}
-}
+}
\ No newline at end of file
diff --git a/lang/form/en-us.json b/lang/form/en-us.json
index 5fd7b4c..e89aaf5 100644
--- a/lang/form/en-us.json
+++ b/lang/form/en-us.json
@@ -34,7 +34,9 @@
"resetPasswordThroughLink": "To reset your password, enter your username, email address or a linked contact method username, and submit. A link will be sent to reset your password.",
"resetSent": "Reset Sent.",
"resetSentDescription": "If an account with the given username/contact method exists, a password reset link has been sent via all contact methods available. The code will expire in 30 minutes.",
- "changePassword": "Change Password"
+ "changePassword": "Change Password",
+ "referralsDescription": "Invite friends & family to Jellyfin with this link. Come back here for a new one if it expires.",
+ "copyReferral": "Copy Link"
},
"notifications": {
"errorUserExists": "User already exists.",
@@ -76,4 +78,4 @@
"plural": "Must have at least {n} special characters"
}
}
-}
+}
\ No newline at end of file
diff --git a/lang/form/it-it.json b/lang/form/it-it.json
index aace6a0..1a7c9ab 100644
--- a/lang/form/it-it.json
+++ b/lang/form/it-it.json
@@ -48,4 +48,4 @@
"plural": "Deve avere almeno {n} caratteri speciali"
}
}
-}
+}
\ No newline at end of file
diff --git a/lang/form/sl-si.json b/lang/form/sl-si.json
index fff664a..46dadbb 100644
--- a/lang/form/sl-si.json
+++ b/lang/form/sl-si.json
@@ -57,4 +57,4 @@
"plural": "Potrebnih je vsaj {n} posebnih znakov"
}
}
-}
+}
\ No newline at end of file
diff --git a/lang/pwreset/sl-si.json b/lang/pwreset/sl-si.json
index f867af0..2168146 100644
--- a/lang/pwreset/sl-si.json
+++ b/lang/pwreset/sl-si.json
@@ -13,4 +13,4 @@
"changeYourPassword": "Spremenite svoje geslo po prijavi.",
"enterYourPassword": "Vnesite svoje novo geslo spodaj."
}
-}
+}
\ No newline at end of file
diff --git a/lang/setup/en-us.json b/lang/setup/en-us.json
index eac01bf..1159d34 100644
--- a/lang/setup/en-us.json
+++ b/lang/setup/en-us.json
@@ -157,4 +157,4 @@
"emailMessage": "Email Message",
"emailMessageNotice": "Displays at the bottom of emails."
}
-}
+}
\ No newline at end of file
diff --git a/lang/setup/nds.json b/lang/setup/nds.json
index d45cc97..3cd0f7b 100644
--- a/lang/setup/nds.json
+++ b/lang/setup/nds.json
@@ -149,4 +149,4 @@
"emailMessage": "",
"emailMessageNotice": ""
}
-}
+}
\ No newline at end of file
diff --git a/lang/setup/sl-si.json b/lang/setup/sl-si.json
index 9d7a172..0b770ea 100644
--- a/lang/setup/sl-si.json
+++ b/lang/setup/sl-si.json
@@ -146,4 +146,4 @@
"emailMessage": "",
"emailMessageNotice": ""
}
-}
+}
\ No newline at end of file
diff --git a/lang/telegram/it-it.json b/lang/telegram/it-it.json
index 3273db0..c03f59c 100644
--- a/lang/telegram/it-it.json
+++ b/lang/telegram/it-it.json
@@ -13,4 +13,4 @@
"languageSet": "",
"discordDMs": ""
}
-}
+}
\ No newline at end of file
diff --git a/lang/telegram/nds.json b/lang/telegram/nds.json
index 2b8ad0a..26d8053 100644
--- a/lang/telegram/nds.json
+++ b/lang/telegram/nds.json
@@ -13,4 +13,4 @@
"languageSet": "",
"discordDMs": ""
}
-}
+}
\ No newline at end of file
diff --git a/lang/telegram/sl-si.json b/lang/telegram/sl-si.json
index 96a211d..616961d 100644
--- a/lang/telegram/sl-si.json
+++ b/lang/telegram/sl-si.json
@@ -13,4 +13,4 @@
"languageSet": "Jezik nastavljen na {language}.",
"discordDMs": "Prosimo preverite svoja zasebna sporočila za odziv."
}
-}
+}
\ No newline at end of file
diff --git a/models.go b/models.go
index ee6e089..d9ac8aa 100644
--- a/models.go
+++ b/models.go
@@ -390,6 +390,7 @@ type MyDetailsDTO struct {
Discord *MyDetailsContactMethodsDTO `json:"discord,omitempty"`
Telegram *MyDetailsContactMethodsDTO `json:"telegram,omitempty"`
Matrix *MyDetailsContactMethodsDTO `json:"matrix,omitempty"`
+ HasReferrals bool `json:"has_referrals,omitempty"`
}
type MyDetailsContactMethodsDTO struct {
@@ -418,10 +419,10 @@ type ChangeMyPasswordDTO struct {
}
type GetMyReferralRespDTO struct {
- Code string `json:"code"`
- RemainingUses int `json:"remaining-uses"`
- NoLimit bool `json:"no-limit"`
- Expiry time.Time `json:"expiry"` // Come back after this time to get a new referral
+ Code string `json:"code"`
+ RemainingUses int `json:"remaining_uses"`
+ NoLimit bool `json:"no_limit"`
+ Expiry int64 `json:"expiry"` // Come back after this time to get a new referral
}
type EnableDisableReferralDTO struct {
diff --git a/scripts/langmover/common.json b/scripts/langmover/common.json
index 3d078d3..a4421d5 100644
--- a/scripts/langmover/common.json
+++ b/scripts/langmover/common.json
@@ -38,7 +38,10 @@
"expiry": "common",
"add": "common",
"edit": "common",
- "delete": "admin"
+ "delete": "common",
+ "myAccount": "common",
+ "referrals": "common",
+ "inviteRemainingUses": "admin"
},
"notifications": {
"errorLoginBlank": "common",
diff --git a/ts/user.ts b/ts/user.ts
index 56401f6..b7bfaba 100644
--- a/ts/user.ts
+++ b/ts/user.ts
@@ -1,7 +1,7 @@
import { ThemeManager } from "./modules/theme.js";
import { lang, LangFile, loadLangSelector } from "./modules/lang.js";
import { Modal } from "./modules/modal.js";
-import { _get, _post, _delete, notificationBox, whichAnimationEvent, toDateString, toggleLoader, addLoader, removeLoader } from "./modules/common.js";
+import { _get, _post, _delete, notificationBox, whichAnimationEvent, toDateString, toggleLoader, addLoader, removeLoader, toClipboard } from "./modules/common.js";
import { Login } from "./modules/login.js";
import { Discord, Telegram, Matrix, ServiceConfiguration, MatrixConfiguration } from "./modules/account-linking.js";
import { Validator, ValidatorConf, ValidatorRespDTO } from "./modules/validator.js";
@@ -18,6 +18,7 @@ interface userWindow extends Window {
matrixUserID: string;
discordSendPINMessage: string;
pwrEnabled: string;
+ referralsEnabled: boolean;
}
declare var window: userWindow;
@@ -107,6 +108,14 @@ interface MyDetails {
discord?: MyDetailsContactMethod;
telegram?: MyDetailsContactMethod;
matrix?: MyDetailsContactMethod;
+ has_referrals: boolean;
+}
+
+interface MyReferral {
+ code: string;
+ remaining_uses: string;
+ no_limit: boolean;
+ expiry: number;
}
interface ContactDTO {
@@ -513,6 +522,62 @@ document.addEventListener("details-reload", () => {
} else if (!statusCard.classList.contains("unfocused")) {
setBestRowSpan(passwordCard, true);
}
+
+ let referralCard = document.getElementById("card-referrals");
+ if (window.referralsEnabled && typeof(referralCard) != "undefined" && referralCard != null) {
+ if (details.has_referrals) {
+ _get("/my/referral", null, (req: XMLHttpRequest) => {
+ if (req.readyState != 4 || req.status != 200) return;
+ const referral: MyReferral = req.response as MyReferral;
+ const infoArea = referralCard.querySelector(".user-referrals-info") as HTMLDivElement;
+
+ infoArea.innerHTML = `
+
+
+ ${referral.no_limit ? "∞" : referral.remaining_uses} ${window.lang.strings("inviteRemainingUses")}
+
+
+
+
+
${window.lang.strings("expiry")} ${toDateString(new Date(referral.expiry * 1000))}
+
+
+ `;
+
+ const linkButton = referralCard.querySelector(".user-referrals-button") as HTMLButtonElement;
+
+ let codeLink = window.location.href;
+ for (let split of ["#", "?", "account", "my"]) {
+ codeLink = codeLink.split(split)[0];
+ }
+ if (codeLink.slice(-1) != "/") { codeLink += "/"; }
+ codeLink = codeLink + "invite/" + referral.code;
+
+ linkButton.addEventListener("click", () => {
+ toClipboard(codeLink);
+ const content = linkButton.innerHTML;
+ linkButton.innerHTML = `
+ ${window.lang.strings("copied")}
+ `;
+ linkButton.classList.add("~positive");
+ linkButton.classList.remove("~info");
+ setTimeout(() => {
+ linkButton.classList.add("~info");
+ linkButton.classList.remove("~positive");
+ linkButton.innerHTML = content;
+ }, 2000);
+ });
+
+
+
+
+ referralCard.classList.remove("unfocused");
+
+ });
+ } else {
+ referralCard.classList.add("unfocused");
+ }
+ }
}
});
});
diff --git a/views.go b/views.go
index 8b2bcf3..2d311ec 100644
--- a/views.go
+++ b/views.go
@@ -204,6 +204,7 @@ func (app *appContext) MyUserPage(gc *gin.Context) {
"langName": lang,
"jfLink": app.config.Section("ui").Key("redirect_url").String(),
"requirements": app.validator.getCriteria(),
+ "referralsEnabled": app.config.Section("user_page").Key("enabled").MustBool(false) && app.config.Section("user_page").Key("referrals").MustBool(false),
}
if telegramEnabled {
data["telegramUsername"] = app.telegram.username