Skip to content

Commit

Permalink
feat - add support for guild presence update event
Browse files Browse the repository at this point in the history
  • Loading branch information
Jaga committed Oct 22, 2023
1 parent d5af11f commit faedf2f
Show file tree
Hide file tree
Showing 12 changed files with 215 additions and 27 deletions.
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"dependencies": {
"@grpc/grpc-js": "^1.8.13",
"@grpc/proto-loader": "^0.7.6",
"@live-apps/discord": "^1.0.13",
"@live-apps/discord": "^1.0.16",
"@typegoose/typegoose": "^10.3.4",
"@types/node": "^18.15.8",
"discord.js": "^14.8.0",
Expand Down
17 changes: 16 additions & 1 deletion src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { EventsHandler } from './handlers/events_handler.service';
import { DiscordEventsProcessor } from './service/discord-events-processor';
import { DiscordEvents } from '@live-apps/discord';
import { ActivityType, Guild, GuildMember, Message } from 'discord.js';
import { DiscordPresenceEvent } from './interface/discord_presence';

/**
* LiveApps Discord Client Config
Expand All @@ -22,6 +23,7 @@ export const client = new Client({
DiscordEvents.guildUpdate,
DiscordEvents.messageDelete,
DiscordEvents.messageUpdate,
DiscordEvents.presenceUpdate,
DiscordEvents.raw,
],
redisOptions: {
Expand Down Expand Up @@ -157,8 +159,21 @@ export class App {

return this.eventsHandler.guildMemberRemove(guildMember);
});

/**
* Guild Presence Update
*/
client.on(
'presenceUpdate',
async (presenceUpdate: DiscordPresenceEvent) => {
const guildPresence =
this.eventsProcessor.buildGuildPresenceUpdate(presenceUpdate);

return this.eventsHandler.guildPresenceUpdate(guildPresence);
},
);
} catch (error) {
console.log(`App Error - ${error}`);
console.log(`LiveApps Discord Client Error - ${error}`);
}
}
}
11 changes: 11 additions & 0 deletions src/handlers/events_handler.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
IGuildMember,
IGuildMemberUpdate,
IGuildMessage,
IGuildPresence,
IMessageDelete,
IMessageReaction,
IMessageUpdate,
Expand Down Expand Up @@ -118,4 +119,14 @@ export class EventsHandler {
});
return;
}

/**Guild Presence Update */
async guildPresenceUpdate(guildPresence: IGuildPresence) {
KittyChanGrpc.guildPresenceUpdate(guildPresence as any, (err) => {
if (err) {
console.log(err);
}
});
return;
}
}
53 changes: 35 additions & 18 deletions src/interface/discord.interface.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
import { Message } from 'discord.js';

/**Guild */
export class IBasicGuild {
guildId?: string;
guildName?: string;
guildOwner?: string;
guildMembersCount?: number;
guildIcon?: string;
}

/**Message */
export class IGuildMessage {
public guildId?: string;
Expand Down Expand Up @@ -71,13 +80,16 @@ export class IMessageAttachments {
public ephemeral: boolean;
}

/**Guild */
export class IBasicGuild {
/**Discord Message Reaction */
export interface IMessageReaction {
guildId?: string;
guildName?: string;
guildOwner?: string;
guildMembersCount?: number;
guildIcon?: string;
channelId?: string;
messageId?: string;
userId?: string;
messageContent?: string;
isBot?: boolean;
emoji?: IEmoji;
payload?: Message;
}

export class IGuildMember {
Expand All @@ -96,22 +108,27 @@ export class IGuildMemberUpdate {
public isBot?: boolean;
}

/**Discord Message Reaction */
export interface IMessageReaction {
guildId?: string;
channelId?: string;
messageId?: string;
userId?: string;
messageContent?: string;
isBot?: boolean;
emoji?: IEmoji;
payload?: Message;
}

/**Discord Emoji */
export interface IEmoji {
name: string;
id: string;
animated: boolean;
createdAt?: Date;
}

/**Guild Presence */
export interface IGuildPresence {
guildId: string;
userId: string;
status: string;
activities: IGuildPresenceActivities[];
}

export interface IGuildPresenceActivities {
name: string;
type: number;
url: string;
details: string;
state: string;
createdTimestamp: string;
}
6 changes: 6 additions & 0 deletions src/interface/discord_presence.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { Presence } from 'discord.js';

export interface DiscordPresenceEvent {
oldPresence: Presence;
newPresence: Presence;
}
17 changes: 17 additions & 0 deletions src/proto/kitty_chan.proto
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ service EventsService{
rpc guildMemberAdd (IGuildMember) returns (NoResponse);
rpc guildMemberRemove (IGuildMember) returns (NoResponse);
rpc guildMemberUpdate (IGuildMemberUpdate) returns (NoResponse);
rpc guildPresenceUpdate (IGuildPresenceUpdate) returns (NoResponse);
}


Expand Down Expand Up @@ -131,4 +132,20 @@ message IEmoji{
string id = 2;
string name = 3;
string createdAt = 4;
}

message IGuildPresenceUpdate{
string guildId = 1;
string userId = 2;
string status = 3;
repeated IGuildPresenceActivities activities = 4;
}

message IGuildPresenceActivities{
string name = 1;
int32 type = 2;
string url = 3;
string details = 4;
string state = 5;
string createdTimestamp = 6;
}
2 changes: 2 additions & 0 deletions src/proto/kitty_chan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ export interface ProtoGrpcType {
IGuildMessage: MessageTypeDefinition;
IGuildMessageDelete: MessageTypeDefinition;
IGuildMessageUpdate: MessageTypeDefinition;
IGuildPresenceActivities: MessageTypeDefinition;
IGuildPresenceUpdate: MessageTypeDefinition;
IMessageAttachments: MessageTypeDefinition;
IMessageMentionRoles: MessageTypeDefinition;
IMessageMentionUsers: MessageTypeDefinition;
Expand Down
56 changes: 56 additions & 0 deletions src/proto/kitty_chan/EventsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ import type {
IGuildMessageUpdate as _kitty_chan_IGuildMessageUpdate,
IGuildMessageUpdate__Output as _kitty_chan_IGuildMessageUpdate__Output,
} from '../kitty_chan/IGuildMessageUpdate';
import type {
IGuildPresenceUpdate as _kitty_chan_IGuildPresenceUpdate,
IGuildPresenceUpdate__Output as _kitty_chan_IGuildPresenceUpdate__Output,
} from '../kitty_chan/IGuildPresenceUpdate';
import type {
IMessageReaction as _kitty_chan_IMessageReaction,
IMessageReaction__Output as _kitty_chan_IMessageReaction__Output,
Expand Down Expand Up @@ -241,6 +245,47 @@ export interface EventsServiceClient extends grpc.Client {
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;

guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
metadata: grpc.Metadata,
options: grpc.CallOptions,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;
guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
metadata: grpc.Metadata,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;
guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
options: grpc.CallOptions,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;
guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;
guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
metadata: grpc.Metadata,
options: grpc.CallOptions,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;
guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
metadata: grpc.Metadata,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;
guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
options: grpc.CallOptions,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;
guildPresenceUpdate(
argument: _kitty_chan_IGuildPresenceUpdate,
callback: grpc.requestCallback<_kitty_chan_NoResponse__Output>,
): grpc.ClientUnaryCall;

guildUpdate(
argument: _kitty_chan_IBasicGuild,
metadata: grpc.Metadata,
Expand Down Expand Up @@ -515,6 +560,11 @@ export interface EventsServiceHandlers
_kitty_chan_NoResponse
>;

guildPresenceUpdate: grpc.handleUnaryCall<
_kitty_chan_IGuildPresenceUpdate__Output,
_kitty_chan_NoResponse
>;

guildUpdate: grpc.handleUnaryCall<
_kitty_chan_IBasicGuild__Output,
_kitty_chan_NoResponse
Expand Down Expand Up @@ -577,6 +627,12 @@ export interface EventsServiceDefinition extends grpc.ServiceDefinition {
_kitty_chan_IGuildMemberUpdate__Output,
_kitty_chan_NoResponse__Output
>;
guildPresenceUpdate: MethodDefinition<
_kitty_chan_IGuildPresenceUpdate,
_kitty_chan_NoResponse,
_kitty_chan_IGuildPresenceUpdate__Output,
_kitty_chan_NoResponse__Output
>;
guildUpdate: MethodDefinition<
_kitty_chan_IBasicGuild,
_kitty_chan_NoResponse,
Expand Down
19 changes: 19 additions & 0 deletions src/proto/kitty_chan/IGuildPresenceActivities.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Original file: src/proto/kitty_chan.proto

export interface IGuildPresenceActivities {
name?: string;
type?: number;
url?: string;
details?: string;
state?: string;
createdTimestamp?: string;
}

export interface IGuildPresenceActivities__Output {
name?: string;
type?: number;
url?: string;
details?: string;
state?: string;
createdTimestamp?: string;
}
20 changes: 20 additions & 0 deletions src/proto/kitty_chan/IGuildPresenceUpdate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Original file: src/proto/kitty_chan.proto

import type {
IGuildPresenceActivities as _kitty_chan_IGuildPresenceActivities,
IGuildPresenceActivities__Output as _kitty_chan_IGuildPresenceActivities__Output,
} from '../kitty_chan/IGuildPresenceActivities';

export interface IGuildPresenceUpdate {
guildId?: string;
userId?: string;
status?: string;
activities?: _kitty_chan_IGuildPresenceActivities[];
}

export interface IGuildPresenceUpdate__Output {
guildId?: string;
userId?: string;
status?: string;
activities?: _kitty_chan_IGuildPresenceActivities__Output[];
}
25 changes: 25 additions & 0 deletions src/service/discord-events-processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ import {
IGuildMember,
IGuildMemberUpdate,
IGuildMessage,
IGuildPresence,
IMessageDelete,
IMessageReaction,
IMessageUpdate,
} from '../interface/discord.interface';
import { DiscordPresenceEvent } from '../interface/discord_presence';

@injectable()
export class DiscordEventsProcessor {
Expand Down Expand Up @@ -166,4 +168,27 @@ export class DiscordEventsProcessor {

return guild;
}

/**Guild Presence Update */
public buildGuildPresenceUpdate({ newPresence }: DiscordPresenceEvent) {
const presence = {
guildId: newPresence.guild.id,
userId: newPresence.userId,
status: newPresence.status,
activities: [],
} as IGuildPresence;

newPresence.activities.map((e) => {
presence.activities.push({
name: e.name,
type: e.type,
url: e.url,
details: e.details,
state: e.state,
createdTimestamp: e.createdTimestamp.toString(),
});
});

return presence;
}
}

0 comments on commit faedf2f

Please sign in to comment.