-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
ChatMessage.cs
102 lines (94 loc) · 4.34 KB
/
ChatMessage.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TehGM.Wolfringo.Messages.Responses;
namespace TehGM.Wolfringo.Messages
{
/// <summary>A normal chat message.</summary>
/// <remarks>Uses <see cref="ChatResponse"/> as response type.</remarks>
/// <seealso cref="GroupActionChatEvent"/>
[ResponseType(typeof(ChatResponse))]
public class ChatMessage : IChatMessage, IWolfMessage, IRawDataMessage
{
/// <inheritdoc/>
/// <remarks>Equals to <see cref="MessageEventNames.MessageSend"/>.</remarks>
[JsonIgnore]
public string EventName => MessageEventNames.MessageSend;
// json data
/// <inheritdoc/>
public string FlightID { get; private set; }
/// <inheritdoc/>
[Obsolete("WOLF protocol now prefers to use Timestamp as a message ID.")]
public Guid? ID { get; private set; }
/// <inheritdoc/>
public bool IsGroupMessage { get; private set; }
/// <inheritdoc/>
public string MimeType { get; private set; }
/// <inheritdoc/>
public WolfTimestamp? Timestamp { get; private set; }
/// <inheritdoc/>
public uint? SenderID { get; private set; }
/// <inheritdoc/>
public uint RecipientID { get; private set; }
/// <summary>Information about message's latest edit.</summary>
[JsonProperty("edited", NullValueHandling = NullValueHandling.Ignore)]
public EditMetadata? EditInfo { get; private set; }
/// <summary>Is this message soft-deleted by group admin?</summary>
[JsonProperty("isDeleted", DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore)]
public bool IsDeleted { get; private set; }
/// <summary>Is this message tipped?</summary>
[JsonProperty("isTipped", DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore)]
public bool HasTips { get; private set; }
// binary data
/// <inheritdoc/>
[JsonIgnore]
public IReadOnlyCollection<byte> RawData { get; private set; }
// helper props
/// <summary>Is it a private message?</summary>
[JsonIgnore]
public bool IsPrivateMessage => !this.IsGroupMessage;
/// <summary>Message's text.</summary>
[JsonIgnore]
public string Text => Encoding.UTF8.GetString(this.RawData.ToArray());
/// <summary>Is it a text message?</summary>
[JsonIgnore]
public bool IsText => this.MimeType == ChatMessageTypes.Text;
/// <summary>Is it an image message?</summary>
[JsonIgnore]
public bool IsImage => this.MimeType == ChatMessageTypes.ImageLink || this.MimeType == ChatMessageTypes.Image;
/// <summary>Is it a voice message?</summary>
[JsonIgnore]
public bool IsVoice => this.MimeType == ChatMessageTypes.VoiceLink || this.MimeType == ChatMessageTypes.Voice;
/// <summary>Creates a message instance.</summary>
[JsonConstructor]
protected ChatMessage()
{
this.RawData = new List<byte>();
}
/// <summary>Creates a message instance.</summary>
/// <param name="recipientID">User or group ID to send the message to.</param>
/// <param name="groupMessage">Is recipient a group?</param>
/// <param name="type">Mime type of the message.</param>
/// <param name="data">Raw byte data of the message.</param>
public ChatMessage(uint recipientID, bool groupMessage, string type, IEnumerable<byte> data) : this()
{
this.RecipientID = recipientID;
this.MimeType = type;
this.IsGroupMessage = groupMessage;
this.FlightID = Guid.NewGuid().ToString();
this.RawData = (data as IReadOnlyCollection<byte>) ?? new List<byte>(data);
}
/// <summary>Represents metadata about chat message edit.</summary>
public struct EditMetadata
{
/// <summary>User that edited the message.</summary>
[JsonProperty("subscriberId")]
public uint UserID { get; private set; }
/// <summary>Timestamp of message edit.</summary>
[JsonProperty("timestamp")]
public WolfTimestamp Timestamp { get; private set; }
}
}
}