Skip to content

Commit

Permalink
fix(TypingStart): typing methods returning falsy values (#3939)
Browse files Browse the repository at this point in the history
* fix: typing methods returning falsy values

* fix: eslint

* fix: no provided parameters; updated jsdocs

* fix(Typings): reflect typingStop

* refactor: since and lastTimestamp merged into one constructable value

* feat(Typings): document Channel#_typing

* feat: emit TypingData on typingStart; update jsdocs

* feat(Typings): move _typing to TextBasedChannel; sort props alphabetic

* feat(Event): remove typingStop

* feat(Typings): update typings - remove typingStop

* feat(Event): remove typingStop from Constants

* feat(Typing): remove TypingData class - redundant

* refactor(Events): remove TYPING_STOP event

* refactor(TypingData): now is an interface for _typing

* fix(TypingStart): timeout variable, removed emit for TypingData

* feat(Typing): timeout property on Channel#_typing, remove redundancy

* fix(Typings): extra overload(s)

Co-Authored-By: Sugden <28943913+NotSugden@users.noreply.github.com>

* Update index.d.ts

* fix(Typings): remove "private" from interface — invalid TS

* feat(Typings): add PartialUser in case partials are enabled

Co-Authored-By: Sugden <28943913+NotSugden@users.noreply.github.com>

* feat(Typings): document 'timeout' property of TypingData

Co-authored-by: Crawl <icrawltogo@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
  • Loading branch information
3 people committed Mar 21, 2020
1 parent 0f38d80 commit 495cfa9
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 16 deletions.
45 changes: 38 additions & 7 deletions src/client/websocket/handlers/TYPING_START.js
Expand Up @@ -5,14 +5,45 @@ const { Events } = require('../../../util/Constants');
module.exports = (client, { d: data }) => {
const channel = client.channels.cache.get(data.channel_id);
const user = client.users.cache.get(data.user_id);
const timestamp = new Date(data.timestamp * 1000);

if (channel && user) {
/**
* Emitted whenever a user starts typing in a channel.
* @event Client#typingStart
* @param {Channel} channel The channel the user started typing in
* @param {User} user The user that started typing
*/
client.emit(Events.TYPING_START, channel, user);
if (channel.type === 'voice') {
client.emit(Events.WARN, `Discord sent a typing packet to a voice channel ${channel.id}`);
return;
}

if (channel._typing.has(user.id)) {
const typing = channel._typing.get(user.id);

typing.lastTimestamp = timestamp;
typing.elapsedTime = Date.now() - typing.since;
client.clearTimeout(typing.timeout);
typing.timeout = tooLate(channel, user);
} else {
const since = new Date();
const lastTimestamp = new Date();
channel._typing.set(user.id, {
user,
since,
lastTimestamp,
elapsedTime: Date.now() - since,
timeout: tooLate(channel, user),
});

/**
* Emitted whenever a user starts typing in a channel.
* @event Client#typingStart
* @param {Channel} channel The channel the user started typing in
* @param {User} user The user that started typing
*/
client.emit(Events.TYPING_START, channel, user);
}
}
};

function tooLate(channel, user) {
return channel.client.setTimeout(() => {
channel._typing.delete(user.id);
}, 10000);
}
23 changes: 14 additions & 9 deletions typings/index.d.ts
Expand Up @@ -1952,6 +1952,7 @@ declare module 'discord.js' {
}

interface TextBasedChannelFields extends PartialTextBasedChannelFields {
_typing: Map<string, TypingData>;
lastPinTimestamp: number | null;
readonly lastPinAt: Date;
typing: boolean;
Expand Down Expand Up @@ -2780,15 +2781,11 @@ declare module 'discord.js' {
partial: true;
fetch(): Promise<T>;
} & {
[K in keyof Omit<T,
'client' |
'createdAt' |
'createdTimestamp' |
'id' |
'partial' |
'fetch' | O>
// tslint:disable-next-line:ban-types
]: T[K] extends Function ? T[K] : T[K] | null;
[K in keyof Omit<
T,
'client' | 'createdAt' | 'createdTimestamp' | 'id' | 'partial' | 'fetch'
>]: // tslint:disable-next-line:ban-types
T[K] extends Function ? T[K] : T[K] | null;
};

interface PartialDMChannel extends Partialize<DMChannel,
Expand Down Expand Up @@ -2960,6 +2957,14 @@ declare module 'discord.js' {

type TargetUser = number;

interface TypingData {
user: User | PartialUser;
since: Date;
lastTimestamp: Date;
elapsedTime: number;
timeout: NodeJS.Timeout;
}

type UserResolvable = User | Snowflake | Message | GuildMember;

type VerificationLevel = 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH';
Expand Down

0 comments on commit 495cfa9

Please sign in to comment.