Skip to content

Commit 40af56d

Browse files
committed
feat - redis expiry for guilds
1 parent 2ffa94b commit 40af56d

File tree

9 files changed

+81
-4
lines changed

9 files changed

+81
-4
lines changed

src/api/discord/guild.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { configStore } from '../../shared/store/config.store';
55

66
@injectable()
77
export class GuildAPI extends DiscordBaseAPI {
8-
///Get Guild using guild Id
8+
/**Get Guild using guild Id */
99
getGuild(guildId: string) {
1010
return {
1111
method: 'GET',
@@ -17,4 +17,20 @@ export class GuildAPI extends DiscordBaseAPI {
1717
endpointType: `getGuild:{${guildId}}`,
1818
} as IDiscordAxiosConfig;
1919
}
20+
21+
/**Get all guilds */
22+
getAllGuild(limit: number) {
23+
return {
24+
method: 'GET',
25+
url: `${this.DISCORD_API}/users/@me/guilds`,
26+
headers: {
27+
Authorization: this.authorization(configStore.clientOptions.token),
28+
...this.headers,
29+
},
30+
params: {
31+
limit,
32+
},
33+
endpointType: `getAllGuild`,
34+
} as IDiscordAxiosConfig;
35+
}
2036
}

src/api/discord/user.ts

+14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { injectable } from 'inversify';
22
import { DiscordBaseAPI } from './api.discord';
33
import { IDiscordAxiosConfig } from '../../modules/shared/axios.service';
4+
import { configStore } from '../../shared/store/config.store';
45

56
@injectable()
67
export class UserAPI extends DiscordBaseAPI {
@@ -16,6 +17,19 @@ export class UserAPI extends DiscordBaseAPI {
1617
} as IDiscordAxiosConfig;
1718
}
1819

20+
/**Send Message to a user */
21+
createChannel(recipient_id: string) {
22+
return {
23+
method: 'POST',
24+
url: `${this.DISCORD_API}/users/@me/channels`,
25+
headers: {
26+
Authorization: this.authorization(configStore.clientOptions.token),
27+
...this.headers,
28+
},
29+
data: { recipient_id },
30+
} as IDiscordAxiosConfig;
31+
}
32+
1933
/**Get User Guid;s */
2034
guilds(accessToken: string) {
2135
return {

src/modules/client/client.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export class Client extends EventEmitter {
5454
this.message = new Message(messageService);
5555
this.roles = new Roles(rolesService);
5656
this.bot = new Bot();
57-
this.user = new User(userService);
57+
this.user = new User(userService, messageService, redisService);
5858

5959
/**App config */
6060
new RedisProvider().validate(this.options);

src/modules/guild/guild.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,21 @@ export class Guild {
4040
const guild = await this.guildService.getGuildById(guildId);
4141

4242
if (this.options.sync) {
43-
await this.redisService.set(`cache:${guildId}`, JSON.stringify(guild));
43+
await this.redisService.setWithExpiry(
44+
`cache:${guildId}`,
45+
JSON.stringify(guild),
46+
600,
47+
);
4448
} else {
4549
this.cachedGuildIds.add(guildId);
4650
this.cachedGuildData.set(guildId, guild);
4751
}
4852

4953
return guild;
5054
}
55+
56+
/**Fetch all Guilds */
57+
async fetchAll(limit?: number) {
58+
return this.guildService.getAllGuild(limit || 100);
59+
}
5160
}

src/modules/guild/service/guild.service.ts

+5
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ export class GuildService {
1414
const apiConfig = this.guildAPI.getGuild(guildId);
1515
return this.axiosService.discordRequest(apiConfig);
1616
}
17+
18+
async getAllGuild(limit: number) {
19+
const apiConfig = this.guildAPI.getAllGuild(limit);
20+
return this.axiosService.discordRequest(apiConfig);
21+
}
1722
}

src/modules/member/member.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ export class Member {
4343
const guild = await this.memberService.getMemberById(guildId, memberId);
4444

4545
if (clientOptions.sync) {
46-
await this.redisService.set(`cache:${guildId}`, JSON.stringify(guild));
46+
await this.redisService.setWithExpiry(
47+
`cache:${guildId}`,
48+
JSON.stringify(guild),
49+
600,
50+
);
4751
} else {
4852
this.cachedMemberIds.add(guildId);
4953
this.cachedMemberData.set(guildId, guild);

src/modules/shared/axios.service.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { DiscordRateLimiter } from './rate_limiter';
66
export interface IAxiosConfig {
77
method: string;
88
url: string;
9+
params?: any;
910
data?: any;
1011
}
1112

src/modules/users/service/user.service.ts

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ export class UserService {
1515
return this.axiosService.discordRequest(apiConfig);
1616
}
1717

18+
async createChannel(recipient_id: string) {
19+
const apiConfig = this.userAPI.createChannel(recipient_id);
20+
return this.axiosService.discordRequest(apiConfig);
21+
}
22+
1823
async guilds(accessToken: string) {
1924
const apiConfig = this.userAPI.guilds(accessToken);
2025
return this.axiosService.discordRequest(apiConfig);

src/modules/users/user.ts

+23
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,39 @@ import 'reflect-metadata';
22
import { inject } from 'inversify';
33
import { TYPES } from '../../core/types.di';
44
import { UserService } from './service/user.service';
5+
import { RedisService } from '../shared/redis/redis.service';
6+
import { MessageService } from '../message/service/message.service';
57

68
export class User {
79
constructor(
810
@inject(TYPES.UserService) private readonly userService: UserService,
11+
@inject(TYPES.MessageService)
12+
private readonly messageService: MessageService,
13+
@inject(TYPES.RedisService) private readonly redisService: RedisService,
914
) {}
1015

1116
async profile(accessToken: string) {
1217
return this.userService.profile(accessToken);
1318
}
1419

20+
/**This method uses only Redis as of now
21+
* TODO - Add support for app cache!
22+
*/
23+
async sendMessage(userId: string, message: string) {
24+
let channelId: string;
25+
26+
const getUserChannel = await this.redisService.get(`userChannel:${userId}`);
27+
channelId = getUserChannel;
28+
29+
if (!getUserChannel) {
30+
const channel = await this.userService.createChannel(userId);
31+
channelId = channel.id;
32+
33+
await this.redisService.set(`userChannel:${userId}`, channel.id);
34+
}
35+
return this.messageService.sendMessage(channelId, message);
36+
}
37+
1538
async guilds(accessToken: string) {
1639
return this.userService.guilds(accessToken);
1740
}

0 commit comments

Comments
 (0)