diff --git a/auth/auth.qtpl b/auth/auth.qtpl index 2e34332..b1f3507 100644 --- a/auth/auth.qtpl +++ b/auth/auth.qtpl @@ -1,8 +1,6 @@ {% import "net/http" %} -{% import "sort" %} {% import "github.com/bouncepaw/mycorrhiza/cfg" %} {% import "github.com/bouncepaw/mycorrhiza/l18n" %} -{% import "github.com/bouncepaw/mycorrhiza/user" %} {% func Register(rq *http.Request) %} {% code @@ -143,71 +141,3 @@ Telegram auth widget was requested by Yogurt. As you can see, we don't offer use {% endfunc %} -{% code -var userListL10n = map[string]L10nEntry{ - "heading": En("List of users").Ru("Список пользователей"), - "administrators": En("Administrators").Ru("Администраторы"), - "moderators": En("Moderators").Ru("Модераторы"), - "editors": En("Editors").Ru("Редакторы"), - "readers": En("Readers").Ru("Читатели"), -} -%} - -{% func UserList(lc *l18n.Localizer) %} -
-{% code -var get = func(key string) string { - return userListL10n[key].Get(lc.Locale) -} - -var ( - admins = make([]string, 0) - moderators = make([]string, 0) - editors = make([]string, 0) - readers = make([]string, 0) -) -for u := range user.YieldUsers() { - switch u.Group { - // What if we place the users into sorted slices? - case "admin": - admins = append(admins, u.Name) - case "moderator": - moderators = append(moderators, u.Name) - case "editor", "trusted": - editors = append(editors, u.Name) - case "reader": - readers = append(readers, u.Name) - } -} -sort.Strings(admins) -sort.Strings(moderators) -sort.Strings(editors) -sort.Strings(readers) -%} -

{%s get("heading") %}

-
-

{%s get("administrators") %}

-
    {% for _, name := range admins %} -
  1. {%s name %}
  2. - {% endfor %}
-
-
-

{%s get("moderators") %}

-
    {% for _, name := range moderators %} -
  1. {%s name %}
  2. - {% endfor %}
-
-
-

{%s get("editors") %}

-
    {% for _, name := range editors %} -
  1. {%s name %}
  2. - {% endfor %}
-
-
-

{%s get("readers") %}

-
    {% for _, name := range readers %} -
  1. {%s name %}
  2. - {% endfor %}
-
-
-{% endfunc %} diff --git a/auth/auth.qtpl.go b/auth/auth.qtpl.go index dfbbd48..f0f8a22 100644 --- a/auth/auth.qtpl.go +++ b/auth/auth.qtpl.go @@ -8,515 +8,509 @@ package auth import "net/http" //line auth/auth.qtpl:2 -import "sort" - -//line auth/auth.qtpl:3 import "github.com/bouncepaw/mycorrhiza/cfg" -//line auth/auth.qtpl:4 +//line auth/auth.qtpl:3 import "github.com/bouncepaw/mycorrhiza/l18n" //line auth/auth.qtpl:5 -import "github.com/bouncepaw/mycorrhiza/user" - -//line auth/auth.qtpl:7 import ( qtio422016 "io" qt422016 "github.com/valyala/quicktemplate" ) -//line auth/auth.qtpl:7 +//line auth/auth.qtpl:5 var ( _ = qtio422016.Copy _ = qt422016.AcquireByteBuffer ) -//line auth/auth.qtpl:7 +//line auth/auth.qtpl:5 func StreamRegister(qw422016 *qt422016.Writer, rq *http.Request) { -//line auth/auth.qtpl:7 +//line auth/auth.qtpl:5 qw422016.N().S(` `) -//line auth/auth.qtpl:9 +//line auth/auth.qtpl:7 lc := l18n.FromRequest(rq) -//line auth/auth.qtpl:10 +//line auth/auth.qtpl:8 qw422016.N().S(`
`) -//line auth/auth.qtpl:13 +//line auth/auth.qtpl:11 if cfg.AllowRegistration { -//line auth/auth.qtpl:13 +//line auth/auth.qtpl:11 qw422016.N().S(` `) -//line auth/auth.qtpl:31 +//line auth/auth.qtpl:29 streamtelegramWidget(qw422016, lc) -//line auth/auth.qtpl:31 +//line auth/auth.qtpl:29 qw422016.N().S(` `) -//line auth/auth.qtpl:32 +//line auth/auth.qtpl:30 } else if cfg.UseAuth { -//line auth/auth.qtpl:32 +//line auth/auth.qtpl:30 qw422016.N().S(`

`) -//line auth/auth.qtpl:33 +//line auth/auth.qtpl:31 qw422016.E().S(lc.Get("auth.noregister")) -//line auth/auth.qtpl:33 +//line auth/auth.qtpl:31 qw422016.N().S(`

← `) -//line auth/auth.qtpl:34 +//line auth/auth.qtpl:32 qw422016.E().S(lc.Get("auth.go_back")) -//line auth/auth.qtpl:34 +//line auth/auth.qtpl:32 qw422016.N().S(`

`) -//line auth/auth.qtpl:35 +//line auth/auth.qtpl:33 } else { -//line auth/auth.qtpl:35 +//line auth/auth.qtpl:33 qw422016.N().S(`

`) -//line auth/auth.qtpl:36 +//line auth/auth.qtpl:34 qw422016.E().S(lc.Get("auth.noauth")) -//line auth/auth.qtpl:36 +//line auth/auth.qtpl:34 qw422016.N().S(`

← `) -//line auth/auth.qtpl:37 +//line auth/auth.qtpl:35 qw422016.E().S(lc.Get("auth.go_back")) -//line auth/auth.qtpl:37 +//line auth/auth.qtpl:35 qw422016.N().S(`

`) -//line auth/auth.qtpl:38 +//line auth/auth.qtpl:36 } -//line auth/auth.qtpl:38 +//line auth/auth.qtpl:36 qw422016.N().S(`
`) -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 } -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 func WriteRegister(qq422016 qtio422016.Writer, rq *http.Request) { -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 qw422016 := qt422016.AcquireWriter(qq422016) -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 StreamRegister(qw422016, rq) -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 qt422016.ReleaseWriter(qw422016) -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 } -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 func Register(rq *http.Request) string { -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 qb422016 := qt422016.AcquireByteBuffer() -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 WriteRegister(qb422016, rq) -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 qs422016 := string(qb422016.B) -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 qt422016.ReleaseByteBuffer(qb422016) -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 return qs422016 -//line auth/auth.qtpl:41 +//line auth/auth.qtpl:39 } -//line auth/auth.qtpl:43 +//line auth/auth.qtpl:41 func StreamLogin(qw422016 *qt422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:43 +//line auth/auth.qtpl:41 qw422016.N().S(`
`) -//line auth/auth.qtpl:46 +//line auth/auth.qtpl:44 if cfg.UseAuth { -//line auth/auth.qtpl:46 +//line auth/auth.qtpl:44 qw422016.N().S(` `) -//line auth/auth.qtpl:62 +//line auth/auth.qtpl:60 streamtelegramWidget(qw422016, lc) -//line auth/auth.qtpl:62 +//line auth/auth.qtpl:60 qw422016.N().S(` `) -//line auth/auth.qtpl:63 +//line auth/auth.qtpl:61 } else { -//line auth/auth.qtpl:63 +//line auth/auth.qtpl:61 qw422016.N().S(`

`) -//line auth/auth.qtpl:64 +//line auth/auth.qtpl:62 qw422016.E().S(lc.Get("auth.noauth")) -//line auth/auth.qtpl:64 +//line auth/auth.qtpl:62 qw422016.N().S(`

← `) -//line auth/auth.qtpl:65 +//line auth/auth.qtpl:63 qw422016.E().S(lc.Get("auth.go_home")) -//line auth/auth.qtpl:65 +//line auth/auth.qtpl:63 qw422016.N().S(`

`) -//line auth/auth.qtpl:66 +//line auth/auth.qtpl:64 } -//line auth/auth.qtpl:66 +//line auth/auth.qtpl:64 qw422016.N().S(`
`) -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 } -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 func WriteLogin(qq422016 qtio422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 qw422016 := qt422016.AcquireWriter(qq422016) -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 StreamLogin(qw422016, lc) -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 qt422016.ReleaseWriter(qw422016) -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 } -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 func Login(lc *l18n.Localizer) string { -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 qb422016 := qt422016.AcquireByteBuffer() -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 WriteLogin(qb422016, lc) -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 qs422016 := string(qb422016.B) -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 qt422016.ReleaseByteBuffer(qb422016) -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 return qs422016 -//line auth/auth.qtpl:69 +//line auth/auth.qtpl:67 } // Telegram auth widget was requested by Yogurt. As you can see, we don't offer user administrators control over it. Of course we don't. -//line auth/auth.qtpl:72 +//line auth/auth.qtpl:70 func streamtelegramWidget(qw422016 *qt422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:72 +//line auth/auth.qtpl:70 qw422016.N().S(` `) -//line auth/auth.qtpl:73 +//line auth/auth.qtpl:71 if cfg.TelegramEnabled { -//line auth/auth.qtpl:73 +//line auth/auth.qtpl:71 qw422016.N().S(`

`) -//line auth/auth.qtpl:74 +//line auth/auth.qtpl:72 qw422016.E().S(lc.Get("auth.telegram_tip")) -//line auth/auth.qtpl:74 +//line auth/auth.qtpl:72 qw422016.N().S(`

`) -//line auth/auth.qtpl:76 +//line auth/auth.qtpl:74 } -//line auth/auth.qtpl:76 +//line auth/auth.qtpl:74 qw422016.N().S(` `) -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 } -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 func writetelegramWidget(qq422016 qtio422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 qw422016 := qt422016.AcquireWriter(qq422016) -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 streamtelegramWidget(qw422016, lc) -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 qt422016.ReleaseWriter(qw422016) -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 } -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 func telegramWidget(lc *l18n.Localizer) string { -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 qb422016 := qt422016.AcquireByteBuffer() -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 writetelegramWidget(qb422016, lc) -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 qs422016 := string(qb422016.B) -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 qt422016.ReleaseByteBuffer(qb422016) -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 return qs422016 -//line auth/auth.qtpl:77 +//line auth/auth.qtpl:75 } -//line auth/auth.qtpl:79 +//line auth/auth.qtpl:77 func StreamLoginError(qw422016 *qt422016.Writer, err string, lc *l18n.Localizer) { -//line auth/auth.qtpl:79 +//line auth/auth.qtpl:77 qw422016.N().S(`
`) -//line auth/auth.qtpl:82 +//line auth/auth.qtpl:80 switch err { -//line auth/auth.qtpl:83 +//line auth/auth.qtpl:81 case "unknown username": +//line auth/auth.qtpl:81 + qw422016.N().S(` +

`) +//line auth/auth.qtpl:82 + qw422016.E().S(lc.Get("auth.error_username")) +//line auth/auth.qtpl:82 + qw422016.N().S(`

+ `) +//line auth/auth.qtpl:83 + case "wrong password": //line auth/auth.qtpl:83 qw422016.N().S(`

`) //line auth/auth.qtpl:84 - qw422016.E().S(lc.Get("auth.error_username")) + qw422016.E().S(lc.Get("auth.error_password")) //line auth/auth.qtpl:84 qw422016.N().S(`

`) //line auth/auth.qtpl:85 - case "wrong password": + default: //line auth/auth.qtpl:85 qw422016.N().S(`

`) //line auth/auth.qtpl:86 - qw422016.E().S(lc.Get("auth.error_password")) + qw422016.E().S(err) //line auth/auth.qtpl:86 qw422016.N().S(`

`) //line auth/auth.qtpl:87 - default: -//line auth/auth.qtpl:87 - qw422016.N().S(` -

`) -//line auth/auth.qtpl:88 - qw422016.E().S(err) -//line auth/auth.qtpl:88 - qw422016.N().S(`

- `) -//line auth/auth.qtpl:89 } -//line auth/auth.qtpl:89 +//line auth/auth.qtpl:87 qw422016.N().S(`

← `) -//line auth/auth.qtpl:90 +//line auth/auth.qtpl:88 qw422016.E().S(lc.Get("auth.try_again")) -//line auth/auth.qtpl:90 +//line auth/auth.qtpl:88 qw422016.N().S(`

`) -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 } -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 func WriteLoginError(qq422016 qtio422016.Writer, err string, lc *l18n.Localizer) { -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 qw422016 := qt422016.AcquireWriter(qq422016) -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 StreamLoginError(qw422016, err, lc) -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 qt422016.ReleaseWriter(qw422016) -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 } -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 func LoginError(err string, lc *l18n.Localizer) string { -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 qb422016 := qt422016.AcquireByteBuffer() -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 WriteLoginError(qb422016, err, lc) -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 qs422016 := string(qb422016.B) -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 qt422016.ReleaseByteBuffer(qb422016) -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 return qs422016 -//line auth/auth.qtpl:93 +//line auth/auth.qtpl:91 } -//line auth/auth.qtpl:95 +//line auth/auth.qtpl:93 func StreamLogout(qw422016 *qt422016.Writer, can bool, lc *l18n.Localizer) { -//line auth/auth.qtpl:95 +//line auth/auth.qtpl:93 qw422016.N().S(`
`) -//line auth/auth.qtpl:98 +//line auth/auth.qtpl:96 if can { -//line auth/auth.qtpl:98 +//line auth/auth.qtpl:96 qw422016.N().S(`

`) -//line auth/auth.qtpl:99 +//line auth/auth.qtpl:97 qw422016.E().S(lc.Get("auth.logout_header")) -//line auth/auth.qtpl:99 +//line auth/auth.qtpl:97 qw422016.N().S(`

`) -//line auth/auth.qtpl:102 +//line auth/auth.qtpl:100 qw422016.E().S(lc.Get("auth.go_home")) -//line auth/auth.qtpl:102 +//line auth/auth.qtpl:100 qw422016.N().S(`
`) -//line auth/auth.qtpl:104 +//line auth/auth.qtpl:102 } else { -//line auth/auth.qtpl:104 +//line auth/auth.qtpl:102 qw422016.N().S(`

`) -//line auth/auth.qtpl:105 +//line auth/auth.qtpl:103 qw422016.E().S(lc.Get("auth.logout_anon")) -//line auth/auth.qtpl:105 +//line auth/auth.qtpl:103 qw422016.N().S(`

`) -//line auth/auth.qtpl:106 +//line auth/auth.qtpl:104 qw422016.E().S(lc.Get("auth.login_title")) -//line auth/auth.qtpl:106 +//line auth/auth.qtpl:104 qw422016.N().S(`

← `) -//line auth/auth.qtpl:107 +//line auth/auth.qtpl:105 qw422016.E().S(lc.Get("auth.go_home")) -//line auth/auth.qtpl:107 +//line auth/auth.qtpl:105 qw422016.N().S(`

`) -//line auth/auth.qtpl:108 +//line auth/auth.qtpl:106 } -//line auth/auth.qtpl:108 +//line auth/auth.qtpl:106 qw422016.N().S(`
`) -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 } -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 func WriteLogout(qq422016 qtio422016.Writer, can bool, lc *l18n.Localizer) { -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 qw422016 := qt422016.AcquireWriter(qq422016) -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 StreamLogout(qw422016, can, lc) -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 qt422016.ReleaseWriter(qw422016) -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 } -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 func Logout(can bool, lc *l18n.Localizer) string { -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 qb422016 := qt422016.AcquireByteBuffer() -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 WriteLogout(qb422016, can, lc) -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 qs422016 := string(qb422016.B) -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 qt422016.ReleaseByteBuffer(qb422016) -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 return qs422016 -//line auth/auth.qtpl:111 +//line auth/auth.qtpl:109 } -//line auth/auth.qtpl:113 +//line auth/auth.qtpl:111 func StreamLock(qw422016 *qt422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:113 +//line auth/auth.qtpl:111 qw422016.N().S(` @@ -524,9 +518,9 @@ func StreamLock(qw422016 *qt422016.Writer, lc *l18n.Localizer) { 🔒 `) -//line auth/auth.qtpl:119 +//line auth/auth.qtpl:117 qw422016.E().S(lc.Get("auth.lock_title")) -//line auth/auth.qtpl:119 +//line auth/auth.qtpl:117 qw422016.N().S(` @@ -536,270 +530,68 @@ func StreamLock(qw422016 *qt422016.Writer, lc *l18n.Localizer) {

🔒

`) -//line auth/auth.qtpl:127 +//line auth/auth.qtpl:125 qw422016.E().S(lc.Get("auth.lock_title")) -//line auth/auth.qtpl:127 +//line auth/auth.qtpl:125 qw422016.N().S(`





`) -//line auth/auth.qtpl:139 +//line auth/auth.qtpl:137 streamtelegramWidget(qw422016, lc) -//line auth/auth.qtpl:139 +//line auth/auth.qtpl:137 qw422016.N().S(`
`) -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 } -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 func WriteLock(qq422016 qtio422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 qw422016 := qt422016.AcquireWriter(qq422016) -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 StreamLock(qw422016, lc) -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 qt422016.ReleaseWriter(qw422016) -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 } -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 func Lock(lc *l18n.Localizer) string { -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 qb422016 := qt422016.AcquireByteBuffer() -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 WriteLock(qb422016, lc) -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 qs422016 := string(qb422016.B) -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 qt422016.ReleaseByteBuffer(qb422016) -//line auth/auth.qtpl:144 +//line auth/auth.qtpl:142 return qs422016 -//line auth/auth.qtpl:144 -} - -//line auth/auth.qtpl:147 -var userListL10n = map[string]L10nEntry{ - "heading": En("List of users").Ru("Список пользователей"), - "administrators": En("Administrators").Ru("Администраторы"), - "moderators": En("Moderators").Ru("Модераторы"), - "editors": En("Editors").Ru("Редакторы"), - "readers": En("Readers").Ru("Читатели"), -} - -//line auth/auth.qtpl:156 -func StreamUserList(qw422016 *qt422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:156 - qw422016.N().S(` -
-`) -//line auth/auth.qtpl:159 - var get = func(key string) string { - return userListL10n[key].Get(lc.Locale) - } - - var ( - admins = make([]string, 0) - moderators = make([]string, 0) - editors = make([]string, 0) - readers = make([]string, 0) - ) - for u := range user.YieldUsers() { - switch u.Group { - // What if we place the users into sorted slices? - case "admin": - admins = append(admins, u.Name) - case "moderator": - moderators = append(moderators, u.Name) - case "editor", "trusted": - editors = append(editors, u.Name) - case "reader": - readers = append(readers, u.Name) - } - } - sort.Strings(admins) - sort.Strings(moderators) - sort.Strings(editors) - sort.Strings(readers) - -//line auth/auth.qtpl:186 - qw422016.N().S(` -

`) -//line auth/auth.qtpl:187 - qw422016.E().S(get("heading")) -//line auth/auth.qtpl:187 - qw422016.N().S(`

-
-

`) -//line auth/auth.qtpl:189 - qw422016.E().S(get("administrators")) -//line auth/auth.qtpl:189 - qw422016.N().S(`

-
    `) -//line auth/auth.qtpl:190 - for _, name := range admins { -//line auth/auth.qtpl:190 - qw422016.N().S(` -
  1. `) -//line auth/auth.qtpl:191 - qw422016.E().S(name) -//line auth/auth.qtpl:191 - qw422016.N().S(`
  2. - `) -//line auth/auth.qtpl:192 - } -//line auth/auth.qtpl:192 - qw422016.N().S(`
-
-
-

`) -//line auth/auth.qtpl:195 - qw422016.E().S(get("moderators")) -//line auth/auth.qtpl:195 - qw422016.N().S(`

-
    `) -//line auth/auth.qtpl:196 - for _, name := range moderators { -//line auth/auth.qtpl:196 - qw422016.N().S(` -
  1. `) -//line auth/auth.qtpl:197 - qw422016.E().S(name) -//line auth/auth.qtpl:197 - qw422016.N().S(`
  2. - `) -//line auth/auth.qtpl:198 - } -//line auth/auth.qtpl:198 - qw422016.N().S(`
-
-
-

`) -//line auth/auth.qtpl:201 - qw422016.E().S(get("editors")) -//line auth/auth.qtpl:201 - qw422016.N().S(`

-
    `) -//line auth/auth.qtpl:202 - for _, name := range editors { -//line auth/auth.qtpl:202 - qw422016.N().S(` -
  1. `) -//line auth/auth.qtpl:203 - qw422016.E().S(name) -//line auth/auth.qtpl:203 - qw422016.N().S(`
  2. - `) -//line auth/auth.qtpl:204 - } -//line auth/auth.qtpl:204 - qw422016.N().S(`
-
-
-

`) -//line auth/auth.qtpl:207 - qw422016.E().S(get("readers")) -//line auth/auth.qtpl:207 - qw422016.N().S(`

-
    `) -//line auth/auth.qtpl:208 - for _, name := range readers { -//line auth/auth.qtpl:208 - qw422016.N().S(` -
  1. `) -//line auth/auth.qtpl:209 - qw422016.E().S(name) -//line auth/auth.qtpl:209 - qw422016.N().S(`
  2. - `) -//line auth/auth.qtpl:210 - } -//line auth/auth.qtpl:210 - qw422016.N().S(`
-
-
-`) -//line auth/auth.qtpl:213 -} - -//line auth/auth.qtpl:213 -func WriteUserList(qq422016 qtio422016.Writer, lc *l18n.Localizer) { -//line auth/auth.qtpl:213 - qw422016 := qt422016.AcquireWriter(qq422016) -//line auth/auth.qtpl:213 - StreamUserList(qw422016, lc) -//line auth/auth.qtpl:213 - qt422016.ReleaseWriter(qw422016) -//line auth/auth.qtpl:213 -} - -//line auth/auth.qtpl:213 -func UserList(lc *l18n.Localizer) string { -//line auth/auth.qtpl:213 - qb422016 := qt422016.AcquireByteBuffer() -//line auth/auth.qtpl:213 - WriteUserList(qb422016, lc) -//line auth/auth.qtpl:213 - qs422016 := string(qb422016.B) -//line auth/auth.qtpl:213 - qt422016.ReleaseByteBuffer(qb422016) -//line auth/auth.qtpl:213 - return qs422016 -//line auth/auth.qtpl:213 +//line auth/auth.qtpl:142 } diff --git a/user/users.go b/user/users.go index 41f4135..d2ca5ef 100644 --- a/user/users.go +++ b/user/users.go @@ -1,6 +1,9 @@ package user -import "sync" +import ( + "sort" + "sync" +) var users sync.Map var tokens sync.Map @@ -99,3 +102,24 @@ func terminateSession(token string) { tokens.Delete(token) dumpTokens() } + +func UsersInGroups() (admins []string, moderators []string, editors []string, readers []string) { + for u := range YieldUsers() { + switch u.Group { + // What if we place the users into sorted slices? + case "admin": + admins = append(admins, u.Name) + case "moderator": + moderators = append(moderators, u.Name) + case "editor", "trusted": + editors = append(editors, u.Name) + case "reader": + readers = append(readers, u.Name) + } + } + sort.Strings(admins) + sort.Strings(moderators) + sort.Strings(editors) + sort.Strings(readers) + return +} diff --git a/web/pages.go b/web/pages.go index a2f08ba..e360895 100644 --- a/web/pages.go +++ b/web/pages.go @@ -8,7 +8,7 @@ import ( //go:embed views/*.html var fs embed.FS -var pageOrphans, pageBacklinks *newtmpl.Page +var pageOrphans, pageBacklinks, pageUserList *newtmpl.Page func initPages() { pageOrphans = newtmpl.NewPage(fs, "views/orphans.html", map[string]string{ @@ -20,4 +20,11 @@ func initPages() { "backlinks to link": `Обратные ссылки на {{beautifulName .}}`, "description": `Ниже перечислены гифы, на которых есть ссылка на эту гифу, трансклюзия этой гифы или эта гифа вставлена как изображение.`, }) + pageUserList = newtmpl.NewPage(fs, "views/user-list.html", map[string]string{ + "title": "Список пользователей", + "administrators": "Администраторы", + "moderators": "Модераторы", + "editors": "Редакторы", + "readers": "Читатели", + }) } diff --git a/web/views/user-list.html b/web/views/user-list.html new file mode 100644 index 0000000..1ae4984 --- /dev/null +++ b/web/views/user-list.html @@ -0,0 +1,30 @@ +{{define "title"}}List of users{{end}} +{{define "body"}} +
+

{{template "title"}}

+
{{$u := .UserHypha}} +

{{block "administrators" .}}Administrators{{end}}

+
    + {{range .Admins}}
  1. {{.}}
  2. {{end}} +
+
+
+

{{block "moderators" .}}Moderators{{end}}

+
    + {{range .Moderators}}
  1. {{.}}
  2. {{end}} +
+
+
+

{{block "editors" .}}Editors{{end}}

+
    + {{range .Editors}}
  1. {{.}}
  2. {{end}} +
+
+
+

{{block "readers" .}}Readers{{end}}

+
    + {{range .Readers}}
  1. {{.}}
  2. {{end}} +
+
+
+ {{end}} \ No newline at end of file diff --git a/web/web.go b/web/web.go index b4d31e1..c18b379 100644 --- a/web/web.go +++ b/web/web.go @@ -126,10 +126,14 @@ func groupMiddleware(group string) func(http.Handler) http.Handler { // Auth func handlerUserList(w http.ResponseWriter, rq *http.Request) { - lc := l18n.FromRequest(rq) - w.Header().Set("Content-Type", mime.TypeByExtension(".html")) - w.WriteHeader(http.StatusOK) - w.Write([]byte(viewutil.Base(viewutil.MetaFrom(w, rq), lc.Get("ui.users_title"), auth.UserList(lc), map[string]string{}))) + admins, moderators, editors, readers := user.UsersInGroups() + _ = pageUserList.RenderTo(viewutil.MetaFrom(w, rq), + map[string]any{ + "Admins": admins, + "Moderators": moderators, + "Editors": editors, + "Readers": readers, + }) } func handlerLock(w http.ResponseWriter, rq *http.Request) {