@@ -24,7 +24,138 @@ import {webhookMenu} from "./webhooks.js";
24
24
import { createImg } from "./utils/utils.js" ;
25
25
import { Sticker } from "./sticker.js" ;
26
26
import { ProgessiveDecodeJSON } from "./utils/progessiveLoad.js" ;
27
+ export async function makeInviteMenu ( inviteMenu : Options , guild : Guild , url : string ) {
28
+ const invDiv = document . createElement ( "div" ) ;
29
+ const bansp = ProgessiveDecodeJSON < invitejson [ ] > ( url , {
30
+ headers : guild . headers ,
31
+ } ) ;
32
+ const createInviteHTML = ( invite : invitejson ) => {
33
+ const div = document . createElement ( "div" ) ;
34
+ div . classList . add ( "templateMiniBox" ) ;
35
+
36
+ const edit = document . createElement ( "button" ) ;
37
+ edit . textContent = I18n . edit ( ) ;
38
+
39
+ const code = document . createElement ( "span" ) ;
40
+ code . textContent = invite . code ;
41
+
42
+ const used = document . createElement ( "span" ) ;
43
+ used . textContent = I18n . invite . used ( invite . uses + "" ) ;
44
+
45
+ edit . onclick = ( ) => {
46
+ const opt = inviteMenu . addSubOptions ( invite . code ) ;
47
+ const inviter = new User ( invite . inviter , guild . localuser ) ;
27
48
49
+ opt . addMDText (
50
+ window . location . origin +
51
+ "/invite/" +
52
+ invite . code +
53
+ "?" +
54
+ new URLSearchParams ( [ [ "instance" , guild . info . wellknown ] ] ) ,
55
+ ) ;
56
+
57
+ opt . addText ( I18n . invite . used ( invite . uses + "" ) ) ;
58
+ if ( invite . max_uses !== 0 ) opt . addText ( I18n . invite . maxUses ( invite . max_uses + "" ) ) ;
59
+
60
+ const channel = guild . channels . find ( ( _ ) => _ . id == invite . channel_id ) ;
61
+ if ( channel ) {
62
+ opt . addText ( I18n . invite . forChannel ( channel . name ) ) ;
63
+ }
64
+
65
+ opt . addText ( I18n . invite . createdAt ( new Date ( invite . created_at ) . toLocaleDateString ( I18n . lang ) ) ) ;
66
+
67
+ let expires = I18n . invite . never ( ) ;
68
+ if ( invite . expires_at ) {
69
+ expires = new Date ( invite . expires_at ) . toLocaleDateString ( I18n . lang ) ;
70
+ }
71
+ opt . addText ( I18n . invite . expires ( expires ) ) ;
72
+
73
+ opt . addText ( I18n . webhooks . createdBy ( ) ) ;
74
+ opt . addHTMLArea ( inviter . createWidget ( guild ) ) ;
75
+
76
+ opt . addButtonInput ( "" , I18n . delete ( ) , async ( ) => {
77
+ if (
78
+ (
79
+ await fetch ( guild . info . api + "/invites/" + invite . code , {
80
+ method : "DELETE" ,
81
+ headers : guild . headers ,
82
+ } )
83
+ ) . ok
84
+ ) {
85
+ invsArr = invsArr . filter ( ( _ ) => _ !== invite ) ;
86
+ inviteMenu . returnFromSub ( ) ;
87
+ loadPage ( currentPage ) ;
88
+ }
89
+ } ) ;
90
+ } ;
91
+
92
+ div . append ( used , code , edit ) ;
93
+ return div ;
94
+ } ;
95
+ let invsArr : invitejson [ ] = [ ] ;
96
+ let onpage = 0 ;
97
+ async function loadArr ( ) {
98
+ let invsArr2 : invitejson [ ] = [ ] ;
99
+ let waiting = false ;
100
+ async function addHTML ( ) {
101
+ if ( waiting ) return ;
102
+ waiting = true ;
103
+ await new Promise ( ( res ) => setTimeout ( res , 0 ) ) ;
104
+ waiting = false ;
105
+ invDiv . append ( ...invsArr2 . map ( ( inv ) => createInviteHTML ( inv ) ) ) ;
106
+ invsArr2 = [ ] ;
107
+ }
108
+ while ( ! ( await bansp ) . done ) {
109
+ const inv = await ( await ( await bansp ) . getNext ( ) ) . getWhole ( ) ;
110
+ invsArr . push ( inv ) ;
111
+ if ( onpage < 50 ) {
112
+ invsArr2 . push ( inv ) ;
113
+ addHTML ( ) ;
114
+ onpage ++ ;
115
+ } else {
116
+ next . disabled = false ;
117
+ }
118
+ }
119
+ }
120
+ let currentPage = 0 ;
121
+ function loadPage ( page = 0 ) {
122
+ invDiv . innerHTML = "" ;
123
+ for ( onpage = 0 ; onpage < 50 ; onpage ++ ) {
124
+ const inv = invsArr [ onpage + page * 50 ] ;
125
+ if ( ! inv ) break ;
126
+ invDiv . append ( createInviteHTML ( inv ) ) ;
127
+ }
128
+ if ( onpage === 50 && invsArr [ onpage + page * 50 ] ) {
129
+ next . disabled = false ;
130
+ } else {
131
+ next . disabled = true ;
132
+ }
133
+ }
134
+
135
+ const pageNav = document . createElement ( "div" ) ;
136
+ const back = document . createElement ( "button" ) ;
137
+ back . textContent = I18n . search . back ( ) ;
138
+ back . disabled = ! currentPage ;
139
+ back . onclick = ( ) => {
140
+ back . disabled = ! ( currentPage - 1 ) ;
141
+ next . disabled = false ;
142
+ loadPage ( -- currentPage ) ;
143
+ } ;
144
+
145
+ const next = document . createElement ( "button" ) ;
146
+ next . textContent = I18n . search . next ( ) ;
147
+ next . disabled = true ;
148
+ pageNav . append ( back , next ) ;
149
+ inviteMenu . addHTMLArea ( pageNav ) ;
150
+ next . onclick = ( ) => {
151
+ loadPage ( ++ currentPage ) ;
152
+ back . disabled = false ;
153
+ } ;
154
+
155
+ loadArr ( ) ;
156
+ loadPage ( currentPage ) ;
157
+ inviteMenu . addHTMLArea ( invDiv ) ;
158
+ }
28
159
class Guild extends SnowFlake {
29
160
owner ! : Localuser ;
30
161
headers ! : Localuser [ "headers" ] ;
@@ -426,6 +557,9 @@ class Guild extends SnowFlake {
426
557
genDiv ( ) ;
427
558
emoji . addHTMLArea ( containdiv ) ;
428
559
}
560
+ const inviteMenu = settings . addButton ( I18n . guild . invites ( ) ) ;
561
+ makeInviteMenu ( inviteMenu , this , this . info . api + `/guilds/${ this . id } /invites` ) ;
562
+
429
563
const banMenu = settings . addButton ( I18n . guild . bans ( ) ) ;
430
564
const makeBanMenu = ( ) => {
431
565
const banDiv = document . createElement ( "div" ) ;
0 commit comments