35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Dalamud.Game.Text.SeStringHandling.Payloads;
 | |
| using System.Security.Cryptography;
 | |
| using System.Text;
 | |
| 
 | |
| namespace MareSynchronos.Utils;
 | |
| 
 | |
| public static class ChatUtils
 | |
| {
 | |
|     // Based on https://git.anna.lgbt/anna/ExtraChat/src/branch/main/client/ExtraChat/Util/PayloadUtil.cs
 | |
|     // This must store a Guid (16 bytes), as Chat 2 converts the data back to one
 | |
| 
 | |
|     public static RawPayload CreateExtraChatTagPayload(Guid guid)
 | |
|     {
 | |
|         var header = (byte[])[
 | |
|             0x02,   // Payload.START_BYTE
 | |
|             0x27,   // SeStringChunkType.Interactable
 | |
|             2 + 16, // remaining length: ExtraChat sends 19 here but I think its an error
 | |
|             0x20    // Custom ExtraChat InfoType
 | |
|         ];
 | |
| 
 | |
|         var footer = (byte)0x03; // Payload.END_BYTE
 | |
| 
 | |
|         return new RawPayload([..header, ..guid.ToByteArray(), footer]);
 | |
|     }
 | |
| 
 | |
|     // We have a unique identifier in the form of a GID, which can be consistently mapped to the same GUID
 | |
|     public static RawPayload CreateExtraChatTagPayload(string gid)
 | |
|     {
 | |
|         var gidBytes = UTF8Encoding.UTF8.GetBytes(gid);
 | |
|         var hashedBytes = MD5.HashData(gidBytes);
 | |
|         var guid = new Guid(hashedBytes);
 | |
|         return CreateExtraChatTagPayload(guid);
 | |
|     }
 | |
| }
 | 
