Differences From
Artifact [4bed391611]:
14 14 case [uint16](2) then acc:lpush('🔱') end
15 15 case [uint16](3) then acc:lpush('⚜️') end
16 16 case [uint16](4) then acc:lpush('🗡') end
17 17 case [uint16](5) then acc:lpush('🗝') end
18 18 else acc:lpush('🕴')
19 19 end
20 20 end
21 +
22 +local rnd = lib.crypt.random
23 +local terra
24 +suggest_handle(a: &lib.str.acc)
25 + var start = a.sz
26 + var puncts = array('.','_','-')
27 + var xXx = rnd(uint8, 0, 9) == 0
28 + var leet = rnd(uint8, 0, 8) == 0
29 + var caps = rnd(uint8, 0, 5)
30 + var punct: rawstring = nil
31 + var useadj = rnd(uint8, 0, 4) == 0
32 + if rnd(uint8, 0, 4) == 0 then
33 + punct = puncts[rnd(intptr,0,[puncts.type.N])]
34 + end
35 +
36 + var nouns = array(
37 + 'thunder','bride','blaze','doom','squad','gun','lord','blaster',
38 + 'fuck','hell','hound','piss','shit','killa','terror', 'horror',
39 + 'fear', 'slaughter','murder','general','commander', 'commissar',
40 + 'terrorist','infinity','slut','cunt','whore','bitch', 'bastard',
41 + 'cock','prince','princess','pimp','gay','cop','slayer', 'vampire',
42 + 'vampyre','blood','pain','brute','wolf','sword','star','sun','moon',
43 + 'killer','murderer','thief','arson','fire','ice','frost','hack',
44 + 'hacker','god','master','mistress','slave','rage','freeze','flayer',
45 + 'pirate','ninja','shadow','fog','mist','misery','glory','bear',
46 + 'king','queen','empress','emperor','majesty','space','martian',
47 + 'winter','fall','monk','katana','420','warrior','banana','demon',
48 + 'devil','ghost','wraith','cuck','legend','hero','heroine','goblin',
49 + 'gremlin','troll','dragon','evil','overlord','radiance'
50 + )
51 + var adjs = array(
52 + 'dark','super','supreme','ultra','ultimate','total','infinite',
53 + 'omnipotent','crazy','final','deathless','immortal', 'elite',
54 + 'leet','1337','bloody','fearless','headless','screaming','insane',
55 + 'brutal','legendary','space','frozen','flaming','burning',
56 + 'mighty','flayed','hidden','secret','lost','mystery','glorious',
57 + 'nude','naked','bare','first','radiant','martian','fallen',
58 + 'wandering','dank','demonic','satanic','invisible','based','woke',
59 + 'deadly','lethal','heroic','evil','majestic','luminous'
60 + )
61 +
62 + if xXx then a:lpush('xXx_') end
63 +
64 + if useadj then
65 + var len = rnd(uint8,1,3)
66 + for i = 0, len do
67 + var sz = a.sz
68 + a:push(adjs[rnd(intptr,0,[adjs.type.N])], 0)
69 + if punct ~= nil then a:push(punct, 1) end
70 + if caps == 1 then
71 + a.buf[sz] = lib.str.cupcase(a.buf[sz])
72 + end
73 + end
74 + end
75 + var nounct = rnd(uint8,1,3)
76 + for i = 0, nounct do
77 + var sz = a.sz
78 + a:push(nouns[rnd(intptr,0,[nouns.type.N])], 0)
79 + if punct ~= nil and i+1 ~= nounct then a:push(punct, 1) end
80 + if caps == 1 then
81 + a.buf[sz] = lib.str.cupcase(a.buf[sz])
82 + end
83 + end
84 +
85 + if leet or caps == 2 then for i=start, a.sz do
86 + if caps == 2 and rnd(uint8,0,5)==0 then
87 + a.buf[i] = lib.str.cupcase(a.buf[i])
88 + end
89 + if leet then
90 + switch lib.str.cdowncase(a.buf[i]) do
91 + case [uint8]([string.byte('e')]) then a.buf[i] = @'3' end
92 + case [uint8]([string.byte('i')]) then a.buf[i] = @'1' end
93 + case [uint8]([string.byte('l')]) then a.buf[i] = @'1' end
94 + case [uint8]([string.byte('t')]) then a.buf[i] = @'7' end
95 + case [uint8]([string.byte('s')]) then a.buf[i] = @'5' end
96 + case [uint8]([string.byte('o')]) then a.buf[i] = @'0' end
97 + case [uint8]([string.byte('b')]) then a.buf[i] = @'6' end
98 + end
99 + end
100 + end end
101 +
102 + if (nounct == 1 and not useadj) or rnd(uint8, 0, 5) == 0 then
103 + if punct ~= nil then a:push(punct, 1) end
104 + a:ipush(rnd(uint16,0,65535))
105 + end
106 +
107 + if xXx then a:lpush('_xXx') end
108 +
109 +end
21 110
22 111 local push_num_field = macro(function(acc,name,lbl,min,max,value,disable)
23 112 name = name:asvalue()
24 113 lbl = lbl:asvalue()
25 114 local start = '<div class="elem small">'
26 115 local enabled = start .. string.format('<label for="%s">%s</label><input type="number" id="%s" name="%s" min="', name, lbl, name, name)
27 116 local disabled = start .. string.format('<label>%s</label><div class="txtbox">', lbl)
................................................................................
219 308 else
220 309 ulst:lpush('<span class="id">')
221 310 lib.render.nym(usr, 0, &ulst, false)
222 311 ulst:lpush('</span></li>')
223 312 end
224 313 ::skip::end
225 314 ulst:lpush('</ul>')
315 +
316 + if co.who.rights.powers.invite() or co.who.rights.invites > 0 then
317 + ulst:lpush('<details><summary>create new user</summary><form method="post"><div class="elem"><label for="handle">handle</label><input type="text" name="handle" id="handle" placeholder="')
318 + suggest_handle(&ulst)
319 + ulst:lpush('"></div><button name="act" value="create">create</button></form></details>')
320 + end
321 + ulst:lpush('<details><summary>instantiate remote actor</summary><form method="post"><div class="elem"><label for="xid">xid</label><input type="text" name="xid" id="xid" placeholder="tweetlord@website.tld"></div><button name="act" value="inst">instantiate</button></form></details>')
322 +
226 323 return ulst:finalize()
227 324 end
228 325 do return pstr.null() end
229 326 ::e404:: co:complain(404, 'not found', 'there is no user or resource by that identifier on this server') goto quit
230 327 ::e403:: co:complain(403, 'forbidden', 'you do not have sufficient authority to control that resource')
231 328
232 329 ::quit:: return pstr.null()
233 330 end
234 331
235 332 return render_conf_users