@@ -29,6 +29,7 @@ import {Emoji} from "./emoji.js";
29
29
import { Play } from "./audio/play.js" ;
30
30
import { Message } from "./message.js" ;
31
31
import { badgeArr } from "./Dbadges.js" ;
32
+ import { Rights } from "./rights.js" ;
32
33
33
34
const wsCodesRetry = new Set ( [ 4000 , 4001 , 4002 , 4003 , 4005 , 4007 , 4008 , 4009 ] ) ;
34
35
@@ -79,18 +80,22 @@ class Localuser {
79
80
this . play = _ ;
80
81
} ) ;
81
82
if ( userinfo === - 1 ) {
83
+ this . rights = new Rights ( "" ) ;
82
84
return ;
83
85
}
84
86
this . token = userinfo . token ;
85
87
this . userinfo = userinfo ;
86
88
this . perminfo . guilds ??= { } ;
89
+ this . perminfo . user ??= { } ;
87
90
this . serverurls = this . userinfo . serverurls ;
88
91
this . initialized = false ;
89
92
this . info = this . serverurls ;
90
93
this . headers = {
91
94
"Content-type" : "application/json; charset=UTF-8" ,
92
95
Authorization : this . userinfo . token ,
93
96
} ;
97
+ const rights = this . perminfo . user . rights || "875069521787904" ;
98
+ this . rights = new Rights ( rights ) ;
94
99
}
95
100
async gottenReady ( ready : readyjson ) : Promise < void > {
96
101
await I18n . done ;
@@ -406,6 +411,11 @@ class Localuser {
406
411
await promise ;
407
412
}
408
413
relationshipsUpdate = ( ) => { } ;
414
+ rights : Rights ;
415
+ updateRights ( rights : string | number ) {
416
+ this . rights . update ( rights ) ;
417
+ this . perminfo . user . rights = rights ;
418
+ }
409
419
async handleEvent ( temp : wsjson ) {
410
420
console . debug ( temp ) ;
411
421
if ( temp . s ) this . lastSequence = temp . s ;
@@ -1776,6 +1786,135 @@ class Localuser {
1776
1786
}
1777
1787
} ) ;
1778
1788
}
1789
+ if (
1790
+ this . rights . hasPermission ( "OPERATOR" ) ||
1791
+ this . rights . hasPermission ( "CREATE_REGISTRATION_TOKENS" )
1792
+ ) {
1793
+ const manageInstance = settings . addButton ( I18n . localuser . manageInstance ( ) ) ;
1794
+ if ( this . rights . hasPermission ( "OPERATOR" ) ) {
1795
+ manageInstance . addButtonInput ( "" , I18n . manageInstance . stop ( ) , ( ) => {
1796
+ const menu = new Dialog ( "" ) ;
1797
+ const options = menu . float . options ;
1798
+ options . addTitle ( I18n . manageInstance . AreYouSureStop ( ) ) ;
1799
+ const yesno = options . addOptions ( "" , { ltr : true } ) ;
1800
+ yesno . addButtonInput ( "" , I18n . yes ( ) , ( ) => {
1801
+ fetch ( this . info . api + "/stop" , { headers : this . headers , method : "POST" } ) ;
1802
+ menu . hide ( ) ;
1803
+ } ) ;
1804
+ yesno . addButtonInput ( "" , I18n . no ( ) , ( ) => {
1805
+ menu . hide ( ) ;
1806
+ } ) ;
1807
+ menu . show ( ) ;
1808
+ } ) ;
1809
+ }
1810
+ if ( this . rights . hasPermission ( "CREATE_REGISTRATION_TOKENS" ) ) {
1811
+ manageInstance . addButtonInput ( "" , I18n . manageInstance . createTokens ( ) , ( ) => {
1812
+ const tokens = manageInstance . addSubOptions ( I18n . manageInstance . createTokens ( ) , {
1813
+ noSubmit : true ,
1814
+ } ) ;
1815
+ const count = tokens . addTextInput ( I18n . manageInstance . count ( ) , ( ) => { } , {
1816
+ initText : "1" ,
1817
+ } ) ;
1818
+ const length = tokens . addTextInput ( I18n . manageInstance . length ( ) , ( ) => { } , {
1819
+ initText : "32" ,
1820
+ } ) ;
1821
+ const format = tokens . addSelect (
1822
+ I18n . manageInstance . format ( ) ,
1823
+ ( ) => { } ,
1824
+ [
1825
+ I18n . manageInstance . TokenFormats . JSON ( ) ,
1826
+ I18n . manageInstance . TokenFormats . plain ( ) ,
1827
+ I18n . manageInstance . TokenFormats . URLs ( ) ,
1828
+ ] ,
1829
+ {
1830
+ defaultIndex : 2 ,
1831
+ } ,
1832
+ ) ;
1833
+ format . watchForChange ( ( e ) => {
1834
+ if ( e !== 2 ) {
1835
+ urlOption . removeAll ( ) ;
1836
+ } else {
1837
+ makeURLMenu ( ) ;
1838
+ }
1839
+ } ) ;
1840
+ const urlOption = tokens . addOptions ( "" ) ;
1841
+ const urlOptionsJSON = {
1842
+ url : window . location . origin ,
1843
+ type : "Jank" ,
1844
+ } ;
1845
+ function makeURLMenu ( ) {
1846
+ urlOption
1847
+ . addTextInput ( I18n . manageInstance . clientURL ( ) , ( ) => { } , {
1848
+ initText : urlOptionsJSON . url ,
1849
+ } )
1850
+ . watchForChange ( ( str ) => {
1851
+ urlOptionsJSON . url = str ;
1852
+ } ) ;
1853
+ urlOption
1854
+ . addSelect (
1855
+ I18n . manageInstance . regType ( ) ,
1856
+ ( ) => { } ,
1857
+ [ "Jank" , I18n . manageInstance . genericType ( ) ] ,
1858
+ {
1859
+ defaultIndex : [ "Jank" , "generic" ] . indexOf ( urlOptionsJSON . type ) ,
1860
+ } ,
1861
+ )
1862
+ . watchForChange ( ( i ) => {
1863
+ urlOptionsJSON . type = [ "Jank" , "generic" ] [ i ] ;
1864
+ } ) ;
1865
+ }
1866
+ makeURLMenu ( ) ;
1867
+ tokens . addButtonInput ( "" , I18n . manageInstance . create ( ) , async ( ) => {
1868
+ const params = new URLSearchParams ( ) ;
1869
+ params . set ( "count" , count . value ) ;
1870
+ params . set ( "length" , length . value ) ;
1871
+ const json = ( await (
1872
+ await fetch (
1873
+ this . info . api + "/auth/generate-registration-tokens?" + params . toString ( ) ,
1874
+ {
1875
+ headers : this . headers ,
1876
+ } ,
1877
+ )
1878
+ ) . json ( ) ) as { tokens : string [ ] } ;
1879
+ if ( format . index === 0 ) {
1880
+ pre . textContent = JSON . stringify ( json . tokens ) ;
1881
+ } else if ( format . index === 1 ) {
1882
+ pre . textContent = json . tokens . join ( "\n" ) ;
1883
+ } else if ( format . index === 2 ) {
1884
+ if ( urlOptionsJSON . type === "Jank" ) {
1885
+ const options = new URLSearchParams ( ) ;
1886
+ options . set ( "instance" , this . info . wellknown ) ;
1887
+ pre . textContent = json . tokens
1888
+ . map ( ( token ) => {
1889
+ options . set ( "token" , token ) ;
1890
+ return `${ urlOptionsJSON . url } /register?` + options . toString ( ) ;
1891
+ } )
1892
+ . join ( "\n" ) ;
1893
+ } else {
1894
+ const options = new URLSearchParams ( ) ;
1895
+ pre . textContent = json . tokens
1896
+ . map ( ( token ) => {
1897
+ options . set ( "token" , token ) ;
1898
+ return `${ urlOptionsJSON . url } /register?` + options . toString ( ) ;
1899
+ } )
1900
+ . join ( "\n" ) ;
1901
+ }
1902
+ }
1903
+ } ) ;
1904
+ tokens . addButtonInput ( "" , I18n . manageInstance . copy ( ) , async ( ) => {
1905
+ try {
1906
+ if ( pre . textContent ) {
1907
+ await navigator . clipboard . writeText ( pre . textContent ) ;
1908
+ }
1909
+ } catch ( err ) {
1910
+ console . error ( err ) ;
1911
+ }
1912
+ } ) ;
1913
+ const pre = document . createElement ( "pre" ) ;
1914
+ tokens . addHTMLArea ( pre ) ;
1915
+ } ) ;
1916
+ }
1917
+ }
1779
1918
settings . show ( ) ;
1780
1919
}
1781
1920
readonly botTokens : Map < string , string > = new Map ( ) ;
0 commit comments