@@ -729,6 +729,17 @@ class Channel extends SnowFlake {
729
729
if ( typeof memb !== "string" ) {
730
730
await Member . new ( memb , this . guild ) ;
731
731
}
732
+
733
+ const users = this . usersDiv . deref ( ) ;
734
+ if ( users ) {
735
+ const user = await this . localuser . getUser ( typeof memb === "string" ? memb : memb . id ) ;
736
+ if ( joined ) {
737
+ this . makeUserBox ( user , users ) ;
738
+ } else {
739
+ this . destUserBox ( user ) ;
740
+ }
741
+ }
742
+
732
743
this . updateVoiceUsers ( ) ;
733
744
if ( this . voice === this . localuser . currentVoice ) {
734
745
AVoice . noises ( "join" ) ;
@@ -1060,7 +1071,124 @@ class Channel extends SnowFlake {
1060
1071
if ( ! this . last_pin_timestamp && ! this . lastpin ) return false ;
1061
1072
return this . last_pin_timestamp !== this . lastpin ;
1062
1073
}
1063
- async getHTML ( addstate = true , getMessages = true ) {
1074
+ boxMap = new Map < string , HTMLElement > ( ) ;
1075
+ destUserBox ( user : User ) {
1076
+ const box = this . boxMap . get ( user . id ) ;
1077
+ if ( ! box ) return ;
1078
+ box . remove ( ) ;
1079
+ this . boxMap . delete ( user . id ) ;
1080
+ }
1081
+ async makeUserBox ( user : User , users : HTMLElement ) {
1082
+ const memb = Member . resolveMember ( user , this . guild ) ;
1083
+ const box = document . createElement ( "div" ) ;
1084
+ this . boxMap . set ( user . id , box ) ;
1085
+ if ( user . accent_color != undefined ) {
1086
+ box . style . setProperty (
1087
+ "--accent_color" ,
1088
+ `#${ user . accent_color . toString ( 16 ) . padStart ( 6 , "0" ) } ` ,
1089
+ ) ;
1090
+ }
1091
+ memb . then ( ( _ ) => {
1092
+ if ( ! _ ) return ;
1093
+ if ( _ . accent_color !== undefined ) {
1094
+ box . style . setProperty ( "--accent_color" , `#${ _ . accent_color . toString ( 16 ) . padStart ( 6 , "0" ) } ` ) ;
1095
+ }
1096
+ } ) ;
1097
+
1098
+ box . append ( user . buildpfp ( this . guild ) ) ;
1099
+
1100
+ const span = document . createElement ( "span" ) ;
1101
+ span . textContent = user . name ;
1102
+ memb . then ( ( _ ) => {
1103
+ if ( ! _ ) return ;
1104
+ span . textContent = _ . name ;
1105
+ } ) ;
1106
+ span . classList . add ( "voiceUsername" ) ;
1107
+ box . append ( span ) ;
1108
+ users . append ( box ) ;
1109
+ }
1110
+ usersDiv = new WeakRef ( document . createElement ( "div" ) ) ;
1111
+ async setUpVoiceArea ( ) {
1112
+ if ( ! this . voice ) throw new Error ( "voice not found?" ) ;
1113
+ const voiceArea = document . getElementById ( "voiceArea" ) as HTMLElement ;
1114
+ const buttonRow = document . createElement ( "div" ) ;
1115
+ buttonRow . classList . add ( "flexltr" , "buttonRow" ) ;
1116
+ const updateMicIcon = ( ) => {
1117
+ mspan . classList . remove ( "svg-micmute" , "svg-mic" ) ;
1118
+ mspan . classList . add ( this . localuser . mute ? "svg-micmute" : "svg-mic" ) ;
1119
+ } ;
1120
+
1121
+ const mute = document . createElement ( "div" ) ;
1122
+ const mspan = document . createElement ( "span" ) ;
1123
+ mute . append ( mspan ) ;
1124
+ updateMicIcon ( ) ;
1125
+ this . localuser . updateOtherMic = updateMicIcon ;
1126
+ mute . onclick = ( ) => {
1127
+ this . localuser . mute = ! this . localuser . mute ;
1128
+ this . localuser . updateMic ( ) ;
1129
+ } ;
1130
+ mute . classList . add ( "muteVoiceIcon" ) ;
1131
+
1132
+ const updateCallIcon = ( ) => {
1133
+ cspan . classList . remove ( "svg-call" , "svg-hangup" ) ;
1134
+ cspan . classList . add ( this . voice ?. open ? "svg-hangup" : "svg-call" ) ;
1135
+ } ;
1136
+ const call = document . createElement ( "div" ) ;
1137
+ const cspan = document . createElement ( "span" ) ;
1138
+ call . append ( cspan ) ;
1139
+ updateCallIcon ( ) ;
1140
+ call . onclick = async ( ) => {
1141
+ if ( this . voice ?. userids . has ( this . localuser . user . id ) ) {
1142
+ this . voice . leave ( ) ;
1143
+ } else if ( this . voice ) {
1144
+ await this . localuser . joinVoice ( this ) ;
1145
+ }
1146
+ updateCallIcon ( ) ;
1147
+ } ;
1148
+ call . classList . add ( "callVoiceIcon" ) ;
1149
+
1150
+ buttonRow . append ( mute , call ) ;
1151
+
1152
+ const users = document . createElement ( "div" ) ;
1153
+ users . classList . add ( "voiceUsers" ) ;
1154
+ this . voice . userids . forEach ( async ( _ , id ) => {
1155
+ const user = await this . localuser . getUser ( id ) ;
1156
+ this . makeUserBox ( user , users ) ;
1157
+ } ) ;
1158
+ this . usersDiv = new WeakRef ( users ) ;
1159
+ this . voice . onSpeakingChange = ( id , speaking ) => {
1160
+ const box = this . boxMap . get ( id ) ;
1161
+ if ( ! box ) return ;
1162
+ if ( speaking ) {
1163
+ box . classList . add ( "speaking" ) ;
1164
+ } else {
1165
+ box . classList . remove ( "speaking" ) ;
1166
+ }
1167
+ } ;
1168
+
1169
+ voiceArea . append ( users , buttonRow ) ;
1170
+ }
1171
+ async getHTML ( addstate = true , getMessages : boolean | void = undefined ) {
1172
+ if ( getMessages === undefined ) {
1173
+ getMessages = this . type !== 2 || ! this . localuser . voiceAllowed ;
1174
+ }
1175
+
1176
+ const messages = document . getElementById ( "channelw" ) as HTMLDivElement ;
1177
+ const messageContainers = Array . from ( messages . getElementsByClassName ( "messagecontainer" ) ) ;
1178
+ for ( const thing of messageContainers ) {
1179
+ thing . remove ( ) ;
1180
+ }
1181
+ const chatArea = document . getElementById ( "chatArea" ) as HTMLElement ;
1182
+
1183
+ const voiceArea = document . getElementById ( "voiceArea" ) as HTMLElement ;
1184
+ voiceArea . innerHTML = "" ;
1185
+ if ( getMessages ) {
1186
+ chatArea . style . removeProperty ( "display" ) ;
1187
+ } else {
1188
+ chatArea . style . setProperty ( "display" , "none" ) ;
1189
+ this . setUpVoiceArea ( ) ;
1190
+ }
1191
+
1064
1192
const pinnedM = document . getElementById ( "pinnedMDiv" ) ;
1065
1193
if ( pinnedM ) {
1066
1194
if ( this . unreadPins ( ) ) {
@@ -1069,11 +1197,6 @@ class Channel extends SnowFlake {
1069
1197
pinnedM . classList . remove ( "unreadPin" ) ;
1070
1198
}
1071
1199
}
1072
- const ghostMessages = document . getElementById ( "ghostMessages" ) as HTMLElement ;
1073
- ghostMessages . innerHTML = "" ;
1074
- for ( const thing of this . fakeMessages ) {
1075
- ghostMessages . append ( thing [ 1 ] ) ;
1076
- }
1077
1200
if ( addstate ) {
1078
1201
history . pushState ( [ this . guild_id , this . id ] , "" , "/channels/" + this . guild_id + "/" + this . id ) ;
1079
1202
}
@@ -1095,6 +1218,7 @@ class Channel extends SnowFlake {
1095
1218
if ( this . guild !== this . localuser . lookingguild ) {
1096
1219
this . guild . loadGuild ( ) ;
1097
1220
}
1221
+
1098
1222
if ( this . localuser . channelfocus && this . localuser . channelfocus . myhtml ) {
1099
1223
this . localuser . channelfocus . myhtml . classList . remove ( "viewChannel" ) ;
1100
1224
}
@@ -1117,15 +1241,22 @@ class Channel extends SnowFlake {
1117
1241
return ;
1118
1242
}
1119
1243
1120
- const prom = this . infinite . delete ( ) ;
1244
+ const ghostMessages = document . getElementById ( "ghostMessages" ) as HTMLElement ;
1245
+ ghostMessages . innerHTML = "" ;
1246
+ for ( const thing of this . fakeMessages ) {
1247
+ ghostMessages . append ( thing [ 1 ] ) ;
1248
+ }
1121
1249
1122
- const loading = document . getElementById ( "loadingdiv" ) as HTMLDivElement ;
1123
- Channel . regenLoadingMessages ( ) ;
1124
- loading . classList . add ( "loading" ) ;
1250
+ const prom = this . infinite . delete ( ) ;
1251
+ if ( getMessages ) {
1252
+ const loading = document . getElementById ( "loadingdiv" ) as HTMLDivElement ;
1253
+ Channel . regenLoadingMessages ( ) ;
1254
+ loading . classList . add ( "loading" ) ;
1255
+ }
1125
1256
this . rendertyping ( ) ;
1126
1257
this . localuser . getSidePannel ( ) ;
1127
1258
if ( this . voice && this . localuser . voiceAllowed ) {
1128
- this . localuser . joinVoice ( this ) ;
1259
+ // this.localuser.joinVoice(this);
1129
1260
}
1130
1261
( document . getElementById ( "typebox" ) as HTMLDivElement ) . contentEditable = "" + this . canMessage ;
1131
1262
( document . getElementById ( "upload" ) as HTMLElement ) . style . visibility = this . canMessage
0 commit comments