feat(messenger): typing packets (ConsoleTyping + FriendTyping)

This commit is contained in:
simoleo89
2026-06-02 20:57:38 +02:00
parent 9a678b04fb
commit cf81ca6689
10 changed files with 118 additions and 1 deletions
File diff suppressed because one or more lines are too long
@@ -114,6 +114,7 @@ export class IncomingHeader
public static MESSENGER_SEARCH = 973; public static MESSENGER_SEARCH = 973;
public static MESSENGER_UPDATE = 2800; public static MESSENGER_UPDATE = 2800;
public static CONSOLE_READ_RECEIPT = 4086; public static CONSOLE_READ_RECEIPT = 4086;
public static FRIEND_TYPING = 4088;
public static MODERATION_REPORT_DISABLED = 1651; public static MODERATION_REPORT_DISABLED = 1651;
public static MODERATION_TOOL = 2696; public static MODERATION_TOOL = 2696;
public static MODERATION_USER_INFO = 2866; public static MODERATION_USER_INFO = 2866;
@@ -0,0 +1,16 @@
import { IMessageEvent } from '@nitrots/api';
import { MessageEvent } from '@nitrots/events';
import { FriendIsTypingParser } from '../../parser';
export class FriendIsTypingEvent extends MessageEvent implements IMessageEvent
{
constructor(callBack: Function)
{
super(callBack, FriendIsTypingParser);
}
public getParser(): FriendIsTypingParser
{
return this.parser as FriendIsTypingParser;
}
}
@@ -1,5 +1,6 @@
export * from './AcceptFriendResultEvent'; export * from './AcceptFriendResultEvent';
export * from './ConsoleReadReceiptEvent'; export * from './ConsoleReadReceiptEvent';
export * from './FriendIsTypingEvent';
export * from './FindFriendsProcessResultEvent'; export * from './FindFriendsProcessResultEvent';
export * from './FollowFriendFailedEvent'; export * from './FollowFriendFailedEvent';
export * from './FriendListFragmentEvent'; export * from './FriendListFragmentEvent';
@@ -130,6 +130,7 @@ export class OutgoingHeader
public static REMOVE_FRIEND_CATEGORY = 4083; public static REMOVE_FRIEND_CATEGORY = 4083;
public static MOVE_FRIEND_TO_CATEGORY = 4084; public static MOVE_FRIEND_TO_CATEGORY = 4084;
public static MARK_CONSOLE_READ = 4085; public static MARK_CONSOLE_READ = 4085;
public static CONSOLE_TYPING = 4087;
public static MOD_TOOL_USER_INFO = 3295; public static MOD_TOOL_USER_INFO = 3295;
public static GET_USER_FLAT_CATS = 3027; public static GET_USER_FLAT_CATS = 3027;
public static NAVIGATOR_INIT = 2110; public static NAVIGATOR_INIT = 2110;
@@ -0,0 +1,21 @@
import { IMessageComposer } from '@nitrots/api';
export class ConsoleTypingComposer implements IMessageComposer<ConstructorParameters<typeof ConsoleTypingComposer>>
{
private _data: ConstructorParameters<typeof ConsoleTypingComposer>;
constructor(peerId: number, isTyping: boolean)
{
this._data = [ peerId, isTyping ];
}
public getMessageArray()
{
return this._data;
}
public dispose(): void
{
return;
}
}
@@ -1,5 +1,6 @@
export * from './AcceptFriendMessageComposer'; export * from './AcceptFriendMessageComposer';
export * from './MarkConsoleReadComposer'; export * from './MarkConsoleReadComposer';
export * from './ConsoleTypingComposer';
export * from './AddFriendCategoryComposer'; export * from './AddFriendCategoryComposer';
export * from './DeclineFriendMessageComposer'; export * from './DeclineFriendMessageComposer';
export * from './FindNewFriendsMessageComposer'; export * from './FindNewFriendsMessageComposer';
@@ -0,0 +1,34 @@
import { IMessageDataWrapper, IMessageParser } from '@nitrots/api';
export class FriendIsTypingParser implements IMessageParser
{
private _senderId: number;
private _isTyping: boolean;
public flush(): boolean
{
this._senderId = 0;
this._isTyping = false;
return true;
}
public parse(wrapper: IMessageDataWrapper): boolean
{
if(!wrapper) return false;
this._senderId = wrapper.readInt();
this._isTyping = wrapper.readBoolean();
return true;
}
public get senderId(): number
{
return this._senderId;
}
public get isTyping(): boolean
{
return this._isTyping;
}
}
@@ -0,0 +1,39 @@
import { describe, expect, it } from 'vitest';
import { BinaryReader, BinaryWriter } from '@nitrots/utils';
import { FriendIsTypingParser } from '../FriendIsTypingParser';
class TestWrapper
{
constructor(private reader: BinaryReader) {}
readByte() { return this.reader.readByte(); }
readBoolean() { return this.reader.readByte() === 1; }
readShort() { return this.reader.readShort(); }
readInt() { return this.reader.readInt(); }
readString() { const len = this.reader.readShort(); return this.reader.readBytes(len).toString(); }
header = 0;
get bytesAvailable() { return this.reader.remaining() > 0; }
}
describe('FriendIsTypingParser', () =>
{
it('parses senderId + isTyping=true', () =>
{
const w = new BinaryWriter();
w.writeInt(42); w.writeByte(1);
const parser = new FriendIsTypingParser();
parser.flush();
parser.parse(new TestWrapper(new BinaryReader(w.getBuffer())) as any);
expect(parser.senderId).toBe(42);
expect(parser.isTyping).toBe(true);
});
it('parses isTyping=false', () =>
{
const w = new BinaryWriter();
w.writeInt(42); w.writeByte(0);
const parser = new FriendIsTypingParser();
parser.flush();
parser.parse(new TestWrapper(new BinaryReader(w.getBuffer())) as any);
expect(parser.isTyping).toBe(false);
});
});
@@ -1,5 +1,6 @@
export * from './AcceptFriendFailureData'; export * from './AcceptFriendFailureData';
export * from './ConsoleReadReceiptParser'; export * from './ConsoleReadReceiptParser';
export * from './FriendIsTypingParser';
export * from './AcceptFriendResultParser'; export * from './AcceptFriendResultParser';
export * from './FindFriendsProcessResultParser'; export * from './FindFriendsProcessResultParser';
export * from './FollowFriendFailedParser'; export * from './FollowFriendFailedParser';