You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
| import { ApiV2 } from '.';
 | |
| import { getV2OpenGroupRoom } from '../../data/opengroups';
 | |
| import { ConversationModel } from '../../models/conversation';
 | |
| import { downloadAttachmentOpenGroupV2 } from '../../receiver/attachments';
 | |
| import { sha256 } from '../../session/crypto';
 | |
| import { fromArrayBufferToBase64 } from '../../session/utils/String';
 | |
| import { arrayBufferFromFile } from '../../types/Attachment';
 | |
| import { AttachmentUtil } from '../../util';
 | |
| 
 | |
| export async function updateOpenGroupV2(convo: ConversationModel, groupName: string, avatar: any) {
 | |
|   if (avatar) {
 | |
|     // I hate duplicating this...
 | |
|     const readFile = async (attachment: any) =>
 | |
|       new Promise((resolve, reject) => {
 | |
|         const fileReader = new FileReader();
 | |
|         fileReader.onload = (e: any) => {
 | |
|           const data = e.target.result;
 | |
|           resolve({
 | |
|             ...attachment,
 | |
|             data,
 | |
|             size: data.byteLength,
 | |
|           });
 | |
|         };
 | |
|         fileReader.onerror = reject;
 | |
|         fileReader.onabort = reject;
 | |
|         fileReader.readAsArrayBuffer(attachment.file);
 | |
|       });
 | |
|     const avatarAttachment: any = await readFile({ file: avatar });
 | |
| 
 | |
|     // We want a square
 | |
|     const withBlob = await AttachmentUtil.autoScale(
 | |
|       {
 | |
|         contentType: avatar.type,
 | |
|         file: new Blob([avatarAttachment.data], {
 | |
|           type: avatar.contentType,
 | |
|         }),
 | |
|       },
 | |
|       {
 | |
|         maxSide: 640,
 | |
|         maxSize: 1000 * 1024,
 | |
|       }
 | |
|     );
 | |
|     const dataResized = await arrayBufferFromFile(withBlob.file);
 | |
|     const roomInfos = await getV2OpenGroupRoom(convo.id);
 | |
|     if (!roomInfos || !dataResized.byteLength) {
 | |
|       return false;
 | |
|     }
 | |
|     const uploadedFileDetails = await ApiV2.uploadImageForRoomOpenGroupV2(
 | |
|       new Uint8Array(dataResized),
 | |
|       roomInfos
 | |
|     );
 | |
| 
 | |
|     if (!uploadedFileDetails || !uploadedFileDetails.fileUrl) {
 | |
|       window?.log?.warn('File opengroupv2 upload failed');
 | |
|       return;
 | |
|     }
 | |
|     let url: URL;
 | |
|     try {
 | |
|       url = new URL(uploadedFileDetails.fileUrl);
 | |
| 
 | |
|       const pathname = url.pathname;
 | |
|       const downloaded = await downloadAttachmentOpenGroupV2(pathname, roomInfos);
 | |
|       if (!(downloaded instanceof Uint8Array)) {
 | |
|         const typeFound = typeof downloaded;
 | |
|         throw new Error(`Expected a plain Uint8Array but got ${typeFound}`);
 | |
|       }
 | |
| 
 | |
|       const upgraded = await window.Signal.Migrations.processNewAttachment({
 | |
|         data: downloaded.buffer,
 | |
|         isRaw: true,
 | |
|         url: pathname,
 | |
|       });
 | |
|       const newHash = sha256(fromArrayBufferToBase64(downloaded.buffer));
 | |
|       await convo.setLokiProfile({
 | |
|         displayName: groupName || convo.get('name') || 'Unknown',
 | |
|         avatar: upgraded.path,
 | |
|         avatarHash: newHash,
 | |
|       });
 | |
|     } catch (e) {
 | |
|       window?.log?.error(`Could not decrypt profile image: ${e}`);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return undefined;
 | |
| }
 |