Name2key, Group chat, Group invite / group invite accept / group invite reject
This commit is contained in:
11
dist/classes/Caps.js
vendored
11
dist/classes/Caps.js
vendored
@@ -196,7 +196,16 @@ class Caps {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.getCapability(capability).then((url) => {
|
||||
this.request(url, LLSD.LLSD.formatXML(data), 'application/llsd+xml').then((body) => {
|
||||
resolve(LLSD.LLSD.parseXML(body));
|
||||
let result = null;
|
||||
try {
|
||||
result = LLSD.LLSD.parseXML(body);
|
||||
}
|
||||
catch (err) {
|
||||
console.error('Error parsing LLSD');
|
||||
console.error(body);
|
||||
reject(err);
|
||||
}
|
||||
resolve(result);
|
||||
}).catch((err) => {
|
||||
console.error(err);
|
||||
reject(err);
|
||||
|
||||
2
dist/classes/Caps.js.map
vendored
2
dist/classes/Caps.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/classes/ClientEvents.d.ts
vendored
2
dist/classes/ClientEvents.d.ts
vendored
@@ -6,6 +6,7 @@ import { InstantMessageEvent } from '../events/InstantMessageEvent';
|
||||
import { GroupInviteEvent } from '../events/GroupInviteEvent';
|
||||
import { FriendRequestEvent } from '../events/FriendRequestEvent';
|
||||
import { DisconnectEvent } from '../events/DisconnectEvent';
|
||||
import { GroupChatEvent } from '../events/GroupChatEvent';
|
||||
export declare class ClientEvents {
|
||||
onNearbyChat: Subject<ChatEvent>;
|
||||
onInstantMessage: Subject<InstantMessageEvent>;
|
||||
@@ -15,4 +16,5 @@ export declare class ClientEvents {
|
||||
onTeleportEvent: Subject<TeleportEvent>;
|
||||
onDisconnected: Subject<DisconnectEvent>;
|
||||
onCircuitLatency: Subject<number>;
|
||||
onGroupChat: Subject<GroupChatEvent>;
|
||||
}
|
||||
|
||||
1
dist/classes/ClientEvents.js
vendored
1
dist/classes/ClientEvents.js
vendored
@@ -11,6 +11,7 @@ class ClientEvents {
|
||||
this.onTeleportEvent = new Subject_1.Subject();
|
||||
this.onDisconnected = new Subject_1.Subject();
|
||||
this.onCircuitLatency = new Subject_1.Subject();
|
||||
this.onGroupChat = new Subject_1.Subject();
|
||||
}
|
||||
}
|
||||
exports.ClientEvents = ClientEvents;
|
||||
|
||||
2
dist/classes/ClientEvents.js.map
vendored
2
dist/classes/ClientEvents.js.map
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"ClientEvents.js","sourceRoot":"","sources":["../../lib/classes/ClientEvents.ts"],"names":[],"mappings":";;AAGA,0CAAqC;AAMrC;IAAA;QAEI,iBAAY,GAAuB,IAAI,iBAAO,EAAa,CAAC;QAC5D,qBAAgB,GAAiC,IAAI,iBAAO,EAAuB,CAAC;QACpF,kBAAa,GAA8B,IAAI,iBAAO,EAAoB,CAAC;QAC3E,oBAAe,GAAgC,IAAI,iBAAO,EAAsB,CAAC;QACjF,WAAM,GAAuB,IAAI,iBAAO,EAAa,CAAC;QACtD,oBAAe,GAA2B,IAAI,iBAAO,EAAiB,CAAC;QACvE,mBAAc,GAA8B,IAAI,iBAAO,EAAmB,CAAC;QAC3E,qBAAgB,GAAoB,IAAI,iBAAO,EAAU,CAAC;IAC9D,CAAC;CAAA;AAVD,oCAUC"}
|
||||
{"version":3,"file":"ClientEvents.js","sourceRoot":"","sources":["../../lib/classes/ClientEvents.ts"],"names":[],"mappings":";;AAGA,0CAAqC;AAOrC;IAAA;QAEI,iBAAY,GAAuB,IAAI,iBAAO,EAAa,CAAC;QAC5D,qBAAgB,GAAiC,IAAI,iBAAO,EAAuB,CAAC;QACpF,kBAAa,GAA8B,IAAI,iBAAO,EAAoB,CAAC;QAC3E,oBAAe,GAAgC,IAAI,iBAAO,EAAsB,CAAC;QACjF,WAAM,GAAuB,IAAI,iBAAO,EAAa,CAAC;QACtD,oBAAe,GAA2B,IAAI,iBAAO,EAAiB,CAAC;QACvE,mBAAc,GAA8B,IAAI,iBAAO,EAAmB,CAAC;QAC3E,qBAAgB,GAAoB,IAAI,iBAAO,EAAU,CAAC;QAC1D,gBAAW,GAA4B,IAAI,iBAAO,EAAkB,CAAC;IACzE,CAAC;CAAA;AAXD,oCAWC"}
|
||||
18
dist/classes/Comms.js
vendored
18
dist/classes/Comms.js
vendored
@@ -8,6 +8,8 @@ const LureEvent_1 = require("../events/LureEvent");
|
||||
const InstantMessageEvent_1 = require("../events/InstantMessageEvent");
|
||||
const ChatSourceType_1 = require("../enums/ChatSourceType");
|
||||
const InstantMessageEventFlags_1 = require("../enums/InstantMessageEventFlags");
|
||||
const GroupInviteEvent_1 = require("../events/GroupInviteEvent");
|
||||
const GroupChatEvent_1 = require("../events/GroupChatEvent");
|
||||
class Comms {
|
||||
constructor(circuit, agent, clientEvents) {
|
||||
this.clientEvents = clientEvents;
|
||||
@@ -37,6 +39,12 @@ class Comms {
|
||||
case InstantMessageDialog_1.InstantMessageDialog.MessageBox:
|
||||
break;
|
||||
case InstantMessageDialog_1.InstantMessageDialog.GroupInvitation:
|
||||
const giEvent = new GroupInviteEvent_1.GroupInviteEvent();
|
||||
giEvent.from = im.AgentData.AgentID;
|
||||
giEvent.fromName = Utils_1.Utils.BufferToStringSimple(im.MessageBlock.FromAgentName);
|
||||
giEvent.message = Utils_1.Utils.BufferToStringSimple(im.MessageBlock.Message);
|
||||
giEvent.inviteID = im.MessageBlock.ID;
|
||||
this.clientEvents.onGroupInvite.next(giEvent);
|
||||
break;
|
||||
case InstantMessageDialog_1.InstantMessageDialog.InventoryOffered:
|
||||
break;
|
||||
@@ -141,6 +149,16 @@ class Comms {
|
||||
this.clientEvents.onInstantMessage.next(imEvent);
|
||||
break;
|
||||
}
|
||||
case InstantMessageDialog_1.InstantMessageDialog.SessionSend:
|
||||
{
|
||||
const groupChatEvent = new GroupChatEvent_1.GroupChatEvent();
|
||||
groupChatEvent.from = im.AgentData.AgentID;
|
||||
groupChatEvent.fromName = Utils_1.Utils.BufferToStringSimple(im.MessageBlock.FromAgentName);
|
||||
groupChatEvent.groupID = im.MessageBlock.ID;
|
||||
groupChatEvent.message = Utils_1.Utils.BufferToStringSimple(im.MessageBlock.Message);
|
||||
this.clientEvents.onGroupChat.next(groupChatEvent);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Message_1.Message.ChatFromSimulator:
|
||||
|
||||
2
dist/classes/Comms.js.map
vendored
2
dist/classes/Comms.js.map
vendored
File diff suppressed because one or more lines are too long
28
dist/classes/EventQueueClient.js
vendored
28
dist/classes/EventQueueClient.js
vendored
@@ -6,6 +6,8 @@ const Long = require("long");
|
||||
const IPAddress_1 = require("./IPAddress");
|
||||
const TeleportEvent_1 = require("../events/TeleportEvent");
|
||||
const TeleportEventType_1 = require("../enums/TeleportEventType");
|
||||
const GroupChatEvent_1 = require("../events/GroupChatEvent");
|
||||
const UUID_1 = require("./UUID");
|
||||
class EventQueueClient {
|
||||
constructor(caps, clientEvents) {
|
||||
this.done = false;
|
||||
@@ -50,6 +52,32 @@ class EventQueueClient {
|
||||
this.clientEvents.onTeleportEvent.next(tpEvent);
|
||||
break;
|
||||
}
|
||||
case 'ChatterBoxInvitation':
|
||||
{
|
||||
if (event['body'] && event['body']['instantmessage'] && event['body']['instantmessage']['message_params'] && event['body']['instantmessage']['message_params']['id']) {
|
||||
const messageParams = event['body']['instantmessage']['message_params'];
|
||||
const imSessionID = messageParams['id'];
|
||||
const requestedFolders = {
|
||||
'method': 'accept invitation',
|
||||
'session-id': imSessionID
|
||||
};
|
||||
const groupChatEvent = new GroupChatEvent_1.GroupChatEvent();
|
||||
groupChatEvent.from = new UUID_1.UUID(messageParams['from_id'].toString());
|
||||
groupChatEvent.fromName = messageParams['from_name'];
|
||||
groupChatEvent.groupID = new UUID_1.UUID(messageParams['id'].toString());
|
||||
groupChatEvent.message = messageParams['message'];
|
||||
this.caps.capsRequestXML('ChatSessionRequest', requestedFolders).then((result) => {
|
||||
this.clientEvents.onGroupChat.next(groupChatEvent);
|
||||
}).catch((err) => {
|
||||
console.error(err);
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'ChatterBoxSessionAgentListUpdates':
|
||||
{
|
||||
break;
|
||||
}
|
||||
case 'TeleportFinish':
|
||||
{
|
||||
const info = event['body']['Info'][0];
|
||||
|
||||
2
dist/classes/EventQueueClient.js.map
vendored
2
dist/classes/EventQueueClient.js.map
vendored
File diff suppressed because one or more lines are too long
1
dist/classes/UUID.d.ts
vendored
1
dist/classes/UUID.d.ts
vendored
@@ -2,6 +2,7 @@
|
||||
export declare class UUID {
|
||||
private mUUID;
|
||||
static zero(): UUID;
|
||||
static random(): UUID;
|
||||
constructor(buf?: Buffer | string, pos?: number);
|
||||
setUUID(val: string): boolean;
|
||||
toString: () => string;
|
||||
|
||||
5
dist/classes/UUID.js
vendored
5
dist/classes/UUID.js
vendored
@@ -23,12 +23,17 @@ class UUID {
|
||||
}
|
||||
else {
|
||||
console.error('Can\'t accept UUIDs of type ' + typeof buf);
|
||||
console.trace();
|
||||
}
|
||||
}
|
||||
}
|
||||
static zero() {
|
||||
return new UUID();
|
||||
}
|
||||
static random() {
|
||||
const newUUID = uuid.v4();
|
||||
return new UUID(newUUID);
|
||||
}
|
||||
setUUID(val) {
|
||||
const test = val.trim();
|
||||
if (validator.isUUID(test)) {
|
||||
|
||||
2
dist/classes/UUID.js.map
vendored
2
dist/classes/UUID.js.map
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"UUID.js","sourceRoot":"","sources":["../../lib/classes/UUID.ts"],"names":[],"mappings":";;AAAA,uCAAuC;AACvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7B;IASI,YAAY,GAAqB,EAAE,GAAY;QAPvC,UAAK,GAAG,sCAAsC,CAAC;QA+ChD,aAAQ,GAAG,GAAW,EAAE;YAE3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC,CAAC;QAzCE,EAAE,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CACtB,CAAC;YACG,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAC5B,CAAC;gBACG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAC3B,CAAC;gBACG,MAAM,OAAO,GAAW,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;gBACjD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG;sBACnC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG;sBAC5B,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG;sBAC7B,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG;sBAC7B,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,CACJ,CAAC;gBACG,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,OAAO,GAAG,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC;IACL,CAAC;IA5BD,MAAM,CAAC,IAAI;QAEP,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACtB,CAAC;IA2BM,OAAO,CAAC,GAAW;QAEtB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAC3B,CAAC;YACG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CACJ,CAAC;YACG,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,GAAG,WAAW,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;IAOD,aAAa,CAAC,GAAW,EAAE,GAAW;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACtJ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;CACJ;AA5DD,oBA4DC"}
|
||||
{"version":3,"file":"UUID.js","sourceRoot":"","sources":["../../lib/classes/UUID.ts"],"names":[],"mappings":"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"}
|
||||
@@ -1,6 +1,7 @@
|
||||
import { CommandsBase } from './CommandsBase';
|
||||
import { UUID } from '../UUID';
|
||||
import { ChatType } from '../../enums/ChatType';
|
||||
import { GroupInviteEvent } from '../../events/GroupInviteEvent';
|
||||
export declare class CommunicationsCommands extends CommandsBase {
|
||||
sendInstantMessage(to: UUID | string, message: string): Promise<void>;
|
||||
nearbyChat(message: string, type: ChatType, channel?: number): Promise<void>;
|
||||
@@ -11,6 +12,9 @@ export declare class CommunicationsCommands extends CommandsBase {
|
||||
stopTypingLocal(): Promise<void>;
|
||||
startTypingIM(to: UUID | string): Promise<void>;
|
||||
stopTypingIM(to: UUID | string): Promise<void>;
|
||||
acceptGroupInvite(event: GroupInviteEvent): Promise<void>;
|
||||
rejectGroupInvite(event: GroupInviteEvent): Promise<void>;
|
||||
typeInstantMessage(to: UUID | string, message: string, thinkingTime?: number, charactersPerSecond?: number): Promise<void>;
|
||||
sendGroupMessage(groupID: UUID, message: string): Promise<void>;
|
||||
typeLocalMessage(message: string, thinkingTime?: number, charactersPerSecond?: number): Promise<void>;
|
||||
}
|
||||
|
||||
90
dist/classes/commands/CommunicationsCommands.js
vendored
90
dist/classes/commands/CommunicationsCommands.js
vendored
@@ -30,7 +30,7 @@ class CommunicationsCommands extends CommandsBase_1.CommandsBase {
|
||||
Offline: 1,
|
||||
Dialog: 0,
|
||||
ID: UUID_1.UUID.zero(),
|
||||
Timestamp: 0,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils_1.Utils.StringToBuffer(agentName),
|
||||
Message: Utils_1.Utils.StringToBuffer(message),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
@@ -115,7 +115,7 @@ class CommunicationsCommands extends CommandsBase_1.CommandsBase {
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog_1.InstantMessageDialog.StartTyping,
|
||||
ID: UUID_1.UUID.zero(),
|
||||
Timestamp: 0,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils_1.Utils.StringToBuffer(agentName),
|
||||
Message: Utils_1.Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
@@ -146,7 +146,63 @@ class CommunicationsCommands extends CommandsBase_1.CommandsBase {
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog_1.InstantMessageDialog.StopTyping,
|
||||
ID: UUID_1.UUID.zero(),
|
||||
Timestamp: 0,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils_1.Utils.StringToBuffer(agentName),
|
||||
Message: Utils_1.Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
};
|
||||
im.EstateBlock = {
|
||||
EstateID: 0
|
||||
};
|
||||
const sequenceNo = circuit.sendMessage(im, PacketFlags_1.PacketFlags.Reliable);
|
||||
return circuit.waitForAck(sequenceNo, 10000);
|
||||
}
|
||||
acceptGroupInvite(event) {
|
||||
const circuit = this.circuit;
|
||||
const agentName = this.agent.firstName + ' ' + this.agent.lastName;
|
||||
const im = new ImprovedInstantMessage_1.ImprovedInstantMessageMessage();
|
||||
im.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: circuit.sessionID
|
||||
};
|
||||
im.MessageBlock = {
|
||||
FromGroup: false,
|
||||
ToAgentID: event.from,
|
||||
ParentEstateID: 0,
|
||||
RegionID: UUID_1.UUID.zero(),
|
||||
Position: Vector3_1.Vector3.getZero(),
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog_1.InstantMessageDialog.GroupInvitationAccept,
|
||||
ID: event.inviteID,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils_1.Utils.StringToBuffer(agentName),
|
||||
Message: Utils_1.Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
};
|
||||
im.EstateBlock = {
|
||||
EstateID: 0
|
||||
};
|
||||
const sequenceNo = circuit.sendMessage(im, PacketFlags_1.PacketFlags.Reliable);
|
||||
return circuit.waitForAck(sequenceNo, 10000);
|
||||
}
|
||||
rejectGroupInvite(event) {
|
||||
const circuit = this.circuit;
|
||||
const agentName = this.agent.firstName + ' ' + this.agent.lastName;
|
||||
const im = new ImprovedInstantMessage_1.ImprovedInstantMessageMessage();
|
||||
im.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: circuit.sessionID
|
||||
};
|
||||
im.MessageBlock = {
|
||||
FromGroup: false,
|
||||
ToAgentID: event.from,
|
||||
ParentEstateID: 0,
|
||||
RegionID: UUID_1.UUID.zero(),
|
||||
Position: Vector3_1.Vector3.getZero(),
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog_1.InstantMessageDialog.GroupInvitationDecline,
|
||||
ID: event.inviteID,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils_1.Utils.StringToBuffer(agentName),
|
||||
Message: Utils_1.Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
@@ -201,6 +257,34 @@ class CommunicationsCommands extends CommandsBase_1.CommandsBase {
|
||||
}, thinkingTime);
|
||||
});
|
||||
}
|
||||
sendGroupMessage(groupID, message) {
|
||||
const circuit = this.circuit;
|
||||
const agentName = this.agent.firstName + ' ' + this.agent.lastName;
|
||||
const im = new ImprovedInstantMessage_1.ImprovedInstantMessageMessage();
|
||||
im.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: circuit.sessionID
|
||||
};
|
||||
im.MessageBlock = {
|
||||
FromGroup: false,
|
||||
ToAgentID: groupID,
|
||||
ParentEstateID: 0,
|
||||
RegionID: UUID_1.UUID.zero(),
|
||||
Position: Vector3_1.Vector3.getZero(),
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog_1.InstantMessageDialog.SessionSend,
|
||||
ID: groupID,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils_1.Utils.StringToBuffer(agentName),
|
||||
Message: Utils_1.Utils.StringToBuffer(message),
|
||||
BinaryBucket: Utils_1.Utils.StringToBuffer('')
|
||||
};
|
||||
im.EstateBlock = {
|
||||
EstateID: 0
|
||||
};
|
||||
const sequenceNo = circuit.sendMessage(im, PacketFlags_1.PacketFlags.Reliable);
|
||||
return circuit.waitForAck(sequenceNo, 10000);
|
||||
}
|
||||
typeLocalMessage(message, thinkingTime, charactersPerSecond) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (thinkingTime === undefined) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
1
dist/classes/commands/GridCommands.d.ts
vendored
1
dist/classes/commands/GridCommands.d.ts
vendored
@@ -6,4 +6,5 @@ import { CommandsBase } from './CommandsBase';
|
||||
export declare class GridCommands extends CommandsBase {
|
||||
getRegionHandle(regionID: UUID): Promise<Long>;
|
||||
getRegionMapInfo(gridX: number, gridY: number): Promise<MapInfoReply>;
|
||||
name2Key(name: string): Promise<UUID>;
|
||||
}
|
||||
|
||||
51
dist/classes/commands/GridCommands.js
vendored
51
dist/classes/commands/GridCommands.js
vendored
@@ -4,11 +4,13 @@ const MapInfoReply_1 = require("../../events/MapInfoReply");
|
||||
const RegionHandleRequest_1 = require("../messages/RegionHandleRequest");
|
||||
const Message_1 = require("../../enums/Message");
|
||||
const MapBlockRequest_1 = require("../messages/MapBlockRequest");
|
||||
const UUID_1 = require("../UUID");
|
||||
const MapItemRequest_1 = require("../messages/MapItemRequest");
|
||||
const Utils_1 = require("../Utils");
|
||||
const PacketFlags_1 = require("../../enums/PacketFlags");
|
||||
const GridItemType_1 = require("../../enums/GridItemType");
|
||||
const CommandsBase_1 = require("./CommandsBase");
|
||||
const AvatarPickerRequest_1 = require("../messages/AvatarPickerRequest");
|
||||
class GridCommands extends CommandsBase_1.CommandsBase {
|
||||
getRegionHandle(regionID) {
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -109,6 +111,55 @@ class GridCommands extends CommandsBase_1.CommandsBase {
|
||||
});
|
||||
});
|
||||
}
|
||||
name2Key(name) {
|
||||
const check = name.split('.');
|
||||
if (check.length > 1) {
|
||||
name = check.join(' ');
|
||||
}
|
||||
else {
|
||||
name += ' resident';
|
||||
}
|
||||
name = name.toLowerCase();
|
||||
const queryID = UUID_1.UUID.random();
|
||||
return new Promise((resolve, reject) => {
|
||||
const aprm = new AvatarPickerRequest_1.AvatarPickerRequestMessage();
|
||||
aprm.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: this.circuit.sessionID,
|
||||
QueryID: queryID
|
||||
};
|
||||
aprm.Data = {
|
||||
Name: Utils_1.Utils.StringToBuffer(name)
|
||||
};
|
||||
this.circuit.sendMessage(aprm, PacketFlags_1.PacketFlags.Reliable);
|
||||
this.circuit.waitForMessage(Message_1.Message.AvatarPickerReply, 10000, (packet) => {
|
||||
const apr = packet.message;
|
||||
if (apr.AgentData.QueryID.toString() === queryID.toString()) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}).then((packet) => {
|
||||
let found = null;
|
||||
const apr = packet.message;
|
||||
apr.Data.forEach((dataBlock) => {
|
||||
const resultName = (Utils_1.Utils.BufferToStringSimple(dataBlock.FirstName) + ' ' + Utils_1.Utils.BufferToStringSimple(dataBlock.LastName)).toLowerCase();
|
||||
if (resultName === name) {
|
||||
found = dataBlock.AvatarID;
|
||||
}
|
||||
});
|
||||
if (found !== null) {
|
||||
resolve(found);
|
||||
}
|
||||
else {
|
||||
reject('Name not found');
|
||||
}
|
||||
}).catch((err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.GridCommands = GridCommands;
|
||||
//# sourceMappingURL=GridCommands.js.map
|
||||
2
dist/classes/commands/GridCommands.js.map
vendored
2
dist/classes/commands/GridCommands.js.map
vendored
File diff suppressed because one or more lines are too long
7
dist/events/GroupChatEvent.d.ts
vendored
Normal file
7
dist/events/GroupChatEvent.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import { UUID } from '../classes/UUID';
|
||||
export declare class GroupChatEvent {
|
||||
groupID: UUID;
|
||||
from: UUID;
|
||||
fromName: string;
|
||||
message: string;
|
||||
}
|
||||
6
dist/events/GroupChatEvent.js
vendored
Normal file
6
dist/events/GroupChatEvent.js
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
class GroupChatEvent {
|
||||
}
|
||||
exports.GroupChatEvent = GroupChatEvent;
|
||||
//# sourceMappingURL=GroupChatEvent.js.map
|
||||
1
dist/events/GroupChatEvent.js.map
vendored
Normal file
1
dist/events/GroupChatEvent.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"GroupChatEvent.js","sourceRoot":"","sources":["../../lib/events/GroupChatEvent.ts"],"names":[],"mappings":";;AAEA;CAMC;AAND,wCAMC"}
|
||||
5
dist/events/GroupInviteEvent.d.ts
vendored
5
dist/events/GroupInviteEvent.d.ts
vendored
@@ -1,2 +1,7 @@
|
||||
import { UUID } from '../classes/UUID';
|
||||
export declare class GroupInviteEvent {
|
||||
from: UUID;
|
||||
fromName: string;
|
||||
message: string;
|
||||
inviteID: UUID;
|
||||
}
|
||||
|
||||
2
dist/events/GroupInviteEvent.js.map
vendored
2
dist/events/GroupInviteEvent.js.map
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"GroupInviteEvent.js","sourceRoot":"","sources":["../../lib/events/GroupInviteEvent.ts"],"names":[],"mappings":";;AAAA;CAGC;AAHD,4CAGC"}
|
||||
{"version":3,"file":"GroupInviteEvent.js","sourceRoot":"","sources":["../../lib/events/GroupInviteEvent.ts"],"names":[],"mappings":";;AAEA;CAMC;AAND,4CAMC"}
|
||||
@@ -62,6 +62,42 @@ bot.clientEvents.onDisconnected.subscribe((DisconnectEvent) =>
|
||||
}
|
||||
});
|
||||
|
||||
bot.clientEvents.onGroupChat.subscribe((GroupChatEvent) =>
|
||||
{
|
||||
console.log("Group chat: " + GroupChatEvent.fromName + ': ' + GroupChatEvent.message);
|
||||
if (GroupChatEvent.message === 'marco')
|
||||
{
|
||||
console.log("Sending PONG");
|
||||
bot.clientCommands.comms.sendGroupMessage(GroupChatEvent.groupID, 'polo');
|
||||
}
|
||||
});
|
||||
|
||||
bot.clientEvents.onGroupInvite.subscribe((GroupInviteEvent) =>
|
||||
{
|
||||
|
||||
console.log('Group invite from ' + GroupInviteEvent.fromName + ': '+GroupInviteEvent.message);
|
||||
|
||||
//Resolve avatar key
|
||||
bot.clientCommands.grid.name2Key(GroupInviteEvent.fromName).then((key) =>
|
||||
{
|
||||
if (key.toString() === master)
|
||||
{
|
||||
console.log('Accepting');
|
||||
bot.clientCommands.comms.acceptGroupInvite(GroupInviteEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
console.log('Unauthorised - rejecting');
|
||||
bot.clientCommands.comms.rejectGroupInvite(GroupInviteEvent);
|
||||
}
|
||||
}).catch((err) =>
|
||||
{
|
||||
console.error(err);
|
||||
console.log('Unknown avatar - rejecting');
|
||||
bot.clientCommands.comms.rejectGroupInvite(GroupInviteEvent);
|
||||
});
|
||||
});
|
||||
|
||||
function connect()
|
||||
{
|
||||
console.log("Logging in..");
|
||||
@@ -96,6 +132,10 @@ connect();
|
||||
|
||||
function exitHandler(options, err)
|
||||
{
|
||||
if (err)
|
||||
{
|
||||
console.log(err.stack);
|
||||
}
|
||||
if (isConnected)
|
||||
{
|
||||
console.log("Disconnecting");
|
||||
@@ -105,10 +145,6 @@ function exitHandler(options, err)
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (err)
|
||||
{
|
||||
console.log(err.stack);
|
||||
}
|
||||
if (options.exit)
|
||||
{
|
||||
process.exit();
|
||||
|
||||
@@ -245,7 +245,18 @@ export class Caps
|
||||
{
|
||||
this.request(url, LLSD.LLSD.formatXML(data), 'application/llsd+xml').then((body: string) =>
|
||||
{
|
||||
resolve(LLSD.LLSD.parseXML(body));
|
||||
let result: any = null;
|
||||
try
|
||||
{
|
||||
result = LLSD.LLSD.parseXML(body);
|
||||
}
|
||||
catch (err)
|
||||
{
|
||||
console.error('Error parsing LLSD');
|
||||
console.error(body);
|
||||
reject(err);
|
||||
}
|
||||
resolve(result);
|
||||
}).catch((err) =>
|
||||
{
|
||||
console.error(err);
|
||||
|
||||
@@ -6,6 +6,7 @@ import {InstantMessageEvent} from '../events/InstantMessageEvent';
|
||||
import {GroupInviteEvent} from '../events/GroupInviteEvent';
|
||||
import {FriendRequestEvent} from '../events/FriendRequestEvent';
|
||||
import {DisconnectEvent} from '../events/DisconnectEvent';
|
||||
import {GroupChatEvent} from '../events/GroupChatEvent';
|
||||
|
||||
export class ClientEvents
|
||||
{
|
||||
@@ -17,4 +18,5 @@ export class ClientEvents
|
||||
onTeleportEvent: Subject<TeleportEvent> = new Subject<TeleportEvent>();
|
||||
onDisconnected: Subject<DisconnectEvent> = new Subject<DisconnectEvent>();
|
||||
onCircuitLatency: Subject<number> = new Subject<number>();
|
||||
onGroupChat: Subject<GroupChatEvent> = new Subject<GroupChatEvent>();
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ import {ClientEvents} from './ClientEvents';
|
||||
import {InstantMessageEvent} from '../events/InstantMessageEvent';
|
||||
import {ChatSourceType} from '../enums/ChatSourceType';
|
||||
import {InstantMessageEventFlags} from '../enums/InstantMessageEventFlags';
|
||||
import {GroupInviteEvent} from '../events/GroupInviteEvent';
|
||||
import {GroupChatEvent} from '../events/GroupChatEvent';
|
||||
|
||||
export class Comms
|
||||
{
|
||||
@@ -53,6 +55,12 @@ export class Comms
|
||||
case InstantMessageDialog.MessageBox:
|
||||
break;
|
||||
case InstantMessageDialog.GroupInvitation:
|
||||
const giEvent = new GroupInviteEvent();
|
||||
giEvent.from = im.AgentData.AgentID;
|
||||
giEvent.fromName = Utils.BufferToStringSimple(im.MessageBlock.FromAgentName);
|
||||
giEvent.message = Utils.BufferToStringSimple(im.MessageBlock.Message);
|
||||
giEvent.inviteID = im.MessageBlock.ID;
|
||||
this.clientEvents.onGroupInvite.next(giEvent);
|
||||
break;
|
||||
case InstantMessageDialog.InventoryOffered:
|
||||
break;
|
||||
@@ -157,6 +165,16 @@ export class Comms
|
||||
this.clientEvents.onInstantMessage.next(imEvent);
|
||||
break;
|
||||
}
|
||||
case InstantMessageDialog.SessionSend:
|
||||
{
|
||||
const groupChatEvent = new GroupChatEvent();
|
||||
groupChatEvent.from = im.AgentData.AgentID;
|
||||
groupChatEvent.fromName = Utils.BufferToStringSimple(im.MessageBlock.FromAgentName);
|
||||
groupChatEvent.groupID = im.MessageBlock.ID;
|
||||
groupChatEvent.message = Utils.BufferToStringSimple(im.MessageBlock.Message);
|
||||
this.clientEvents.onGroupChat.next(groupChatEvent);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -6,6 +6,9 @@ import {IPAddress} from './IPAddress';
|
||||
import {TeleportEvent} from '../events/TeleportEvent';
|
||||
import {ClientEvents} from './ClientEvents';
|
||||
import {TeleportEventType} from '../enums/TeleportEventType';
|
||||
import {GroupChatEvent} from '../events/GroupChatEvent';
|
||||
import {Utils} from './Utils';
|
||||
import {UUID} from './UUID';
|
||||
|
||||
export class EventQueueClient
|
||||
{
|
||||
@@ -252,6 +255,39 @@ export class EventQueueClient
|
||||
this.clientEvents.onTeleportEvent.next(tpEvent);
|
||||
break;
|
||||
}
|
||||
case 'ChatterBoxInvitation':
|
||||
{
|
||||
if (event['body'] && event['body']['instantmessage'] && event['body']['instantmessage']['message_params'] && event['body']['instantmessage']['message_params']['id'])
|
||||
{
|
||||
const messageParams = event['body']['instantmessage']['message_params'];
|
||||
const imSessionID = messageParams['id'];
|
||||
const requestedFolders = {
|
||||
'method': 'accept invitation',
|
||||
'session-id': imSessionID
|
||||
};
|
||||
|
||||
const groupChatEvent = new GroupChatEvent();
|
||||
groupChatEvent.from = new UUID(messageParams['from_id'].toString());
|
||||
groupChatEvent.fromName = messageParams['from_name'];
|
||||
groupChatEvent.groupID = new UUID(messageParams['id'].toString());
|
||||
groupChatEvent.message = messageParams['message'];
|
||||
|
||||
|
||||
this.caps.capsRequestXML('ChatSessionRequest', requestedFolders).then((result: any) =>
|
||||
{
|
||||
this.clientEvents.onGroupChat.next(groupChatEvent);
|
||||
}).catch((err) =>
|
||||
{
|
||||
console.error(err);
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'ChatterBoxSessionAgentListUpdates':
|
||||
{
|
||||
// TODO
|
||||
break;
|
||||
}
|
||||
case 'TeleportFinish':
|
||||
{
|
||||
const info = event['body']['Info'][0];
|
||||
|
||||
@@ -9,6 +9,11 @@ export class UUID
|
||||
{
|
||||
return new UUID();
|
||||
}
|
||||
static random(): UUID
|
||||
{
|
||||
const newUUID = uuid.v4();
|
||||
return new UUID(newUUID);
|
||||
}
|
||||
|
||||
constructor(buf?: Buffer | string, pos?: number)
|
||||
{
|
||||
@@ -31,6 +36,7 @@ export class UUID
|
||||
else
|
||||
{
|
||||
console.error('Can\'t accept UUIDs of type ' + typeof buf);
|
||||
console.trace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import {ChatFromViewerMessage} from '../messages/ChatFromViewer';
|
||||
import {ChatType} from '../../enums/ChatType';
|
||||
import {InstantMessageDialog} from '../../enums/InstantMessageDialog';
|
||||
import Timer = NodeJS.Timer;
|
||||
import {GroupInviteEvent} from '../../events/GroupInviteEvent';
|
||||
|
||||
export class CommunicationsCommands extends CommandsBase
|
||||
{
|
||||
@@ -33,7 +34,7 @@ export class CommunicationsCommands extends CommandsBase
|
||||
Offline: 1,
|
||||
Dialog: 0,
|
||||
ID: UUID.zero(),
|
||||
Timestamp: 0,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils.StringToBuffer(agentName),
|
||||
Message: Utils.StringToBuffer(message),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
@@ -134,7 +135,7 @@ export class CommunicationsCommands extends CommandsBase
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog.StartTyping,
|
||||
ID: UUID.zero(),
|
||||
Timestamp: 0,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils.StringToBuffer(agentName),
|
||||
Message: Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
@@ -168,7 +169,67 @@ export class CommunicationsCommands extends CommandsBase
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog.StopTyping,
|
||||
ID: UUID.zero(),
|
||||
Timestamp: 0,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils.StringToBuffer(agentName),
|
||||
Message: Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
};
|
||||
im.EstateBlock = {
|
||||
EstateID: 0
|
||||
};
|
||||
const sequenceNo = circuit.sendMessage(im, PacketFlags.Reliable);
|
||||
return circuit.waitForAck(sequenceNo, 10000);
|
||||
}
|
||||
|
||||
acceptGroupInvite(event: GroupInviteEvent): Promise<void>
|
||||
{
|
||||
const circuit = this.circuit;
|
||||
const agentName = this.agent.firstName + ' ' + this.agent.lastName;
|
||||
const im: ImprovedInstantMessageMessage = new ImprovedInstantMessageMessage();
|
||||
im.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: circuit.sessionID
|
||||
};
|
||||
im.MessageBlock = {
|
||||
FromGroup: false,
|
||||
ToAgentID: event.from,
|
||||
ParentEstateID: 0,
|
||||
RegionID: UUID.zero(),
|
||||
Position: Vector3.getZero(),
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog.GroupInvitationAccept,
|
||||
ID: event.inviteID,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils.StringToBuffer(agentName),
|
||||
Message: Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
};
|
||||
im.EstateBlock = {
|
||||
EstateID: 0
|
||||
};
|
||||
const sequenceNo = circuit.sendMessage(im, PacketFlags.Reliable);
|
||||
return circuit.waitForAck(sequenceNo, 10000);
|
||||
}
|
||||
|
||||
rejectGroupInvite(event: GroupInviteEvent): Promise<void>
|
||||
{
|
||||
const circuit = this.circuit;
|
||||
const agentName = this.agent.firstName + ' ' + this.agent.lastName;
|
||||
const im: ImprovedInstantMessageMessage = new ImprovedInstantMessageMessage();
|
||||
im.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: circuit.sessionID
|
||||
};
|
||||
im.MessageBlock = {
|
||||
FromGroup: false,
|
||||
ToAgentID: event.from,
|
||||
ParentEstateID: 0,
|
||||
RegionID: UUID.zero(),
|
||||
Position: Vector3.getZero(),
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog.GroupInvitationDecline,
|
||||
ID: event.inviteID,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils.StringToBuffer(agentName),
|
||||
Message: Utils.StringToBuffer(''),
|
||||
BinaryBucket: Buffer.allocUnsafe(0)
|
||||
@@ -244,6 +305,36 @@ export class CommunicationsCommands extends CommandsBase
|
||||
});
|
||||
}
|
||||
|
||||
sendGroupMessage(groupID: UUID, message: string): Promise<void>
|
||||
{
|
||||
const circuit = this.circuit;
|
||||
const agentName = this.agent.firstName + ' ' + this.agent.lastName;
|
||||
const im: ImprovedInstantMessageMessage = new ImprovedInstantMessageMessage();
|
||||
im.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: circuit.sessionID
|
||||
};
|
||||
im.MessageBlock = {
|
||||
FromGroup: false,
|
||||
ToAgentID: groupID,
|
||||
ParentEstateID: 0,
|
||||
RegionID: UUID.zero(),
|
||||
Position: Vector3.getZero(),
|
||||
Offline: 0,
|
||||
Dialog: InstantMessageDialog.SessionSend,
|
||||
ID: groupID,
|
||||
Timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
FromAgentName: Utils.StringToBuffer(agentName),
|
||||
Message: Utils.StringToBuffer(message),
|
||||
BinaryBucket: Utils.StringToBuffer('')
|
||||
};
|
||||
im.EstateBlock = {
|
||||
EstateID: 0
|
||||
};
|
||||
const sequenceNo = circuit.sendMessage(im, PacketFlags.Reliable);
|
||||
return circuit.waitForAck(sequenceNo, 10000);
|
||||
}
|
||||
|
||||
typeLocalMessage(message: string, thinkingTime?: number, charactersPerSecond?: number): Promise<void>
|
||||
{
|
||||
return new Promise<void>((resolve, reject) =>
|
||||
|
||||
@@ -13,6 +13,8 @@ import {PacketFlags} from '../../enums/PacketFlags';
|
||||
import {GridItemType} from '../../enums/GridItemType';
|
||||
import {RegionIDAndHandleReplyMessage} from '../messages/RegionIDAndHandleReply';
|
||||
import {CommandsBase} from './CommandsBase';
|
||||
import {AvatarPickerRequestMessage} from '../messages/AvatarPickerRequest';
|
||||
import {AvatarPickerReplyMessage} from '../messages/AvatarPickerReply';
|
||||
export class GridCommands extends CommandsBase
|
||||
{
|
||||
getRegionHandle(regionID: UUID): Promise<Long>
|
||||
@@ -138,4 +140,70 @@ export class GridCommands extends CommandsBase
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
name2Key(name: string): Promise<UUID>
|
||||
{
|
||||
const check = name.split('.');
|
||||
if (check.length > 1)
|
||||
{
|
||||
name = check.join(' ');
|
||||
}
|
||||
else
|
||||
{
|
||||
name += ' resident';
|
||||
}
|
||||
name = name.toLowerCase();
|
||||
|
||||
const queryID = UUID.random();
|
||||
return new Promise<UUID>((resolve, reject) =>
|
||||
{
|
||||
const aprm = new AvatarPickerRequestMessage();
|
||||
aprm.AgentData = {
|
||||
AgentID: this.agent.agentID,
|
||||
SessionID: this.circuit.sessionID,
|
||||
QueryID: queryID
|
||||
};
|
||||
aprm.Data = {
|
||||
Name: Utils.StringToBuffer(name)
|
||||
};
|
||||
|
||||
this.circuit.sendMessage(aprm, PacketFlags.Reliable);
|
||||
this.circuit.waitForMessage(Message.AvatarPickerReply, 10000, (packet: Packet): boolean =>
|
||||
{
|
||||
const apr = packet.message as AvatarPickerReplyMessage;
|
||||
if (apr.AgentData.QueryID.toString() === queryID.toString())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}).then((packet: Packet) =>
|
||||
{
|
||||
let found: UUID | null = null;
|
||||
const apr = packet.message as AvatarPickerReplyMessage;
|
||||
apr.Data.forEach((dataBlock) =>
|
||||
{
|
||||
const resultName = (Utils.BufferToStringSimple(dataBlock.FirstName) + ' ' + Utils.BufferToStringSimple(dataBlock.LastName)).toLowerCase();
|
||||
if (resultName === name)
|
||||
{
|
||||
found = dataBlock.AvatarID;
|
||||
}
|
||||
});
|
||||
|
||||
if (found !== null)
|
||||
{
|
||||
resolve(found);
|
||||
}
|
||||
else
|
||||
{
|
||||
reject('Name not found')
|
||||
}
|
||||
}).catch((err) =>
|
||||
{
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
9
lib/events/GroupChatEvent.ts
Normal file
9
lib/events/GroupChatEvent.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import {UUID} from '../classes/UUID';
|
||||
|
||||
export class GroupChatEvent
|
||||
{
|
||||
groupID: UUID;
|
||||
from: UUID;
|
||||
fromName: string;
|
||||
message: string;
|
||||
}
|
||||
@@ -1,4 +1,9 @@
|
||||
import {UUID} from '../classes/UUID';
|
||||
|
||||
export class GroupInviteEvent
|
||||
{
|
||||
|
||||
from: UUID;
|
||||
fromName: string;
|
||||
message: string;
|
||||
inviteID: UUID;
|
||||
}
|
||||
Reference in New Issue
Block a user