Merge remote-tracking branch 'misskey-dev/develop' into io

This commit is contained in:
まっちゃとーにゅ
2024-01-31 05:10:06 +09:00
200 changed files with 2833 additions and 4369 deletions

View File

@@ -541,10 +541,10 @@ export type Channels = {
mention: (payload: Note) => void;
reply: (payload: Note) => void;
renote: (payload: Note) => void;
follow: (payload: User) => void;
followed: (payload: User) => void;
unfollow: (payload: User) => void;
meUpdated: (payload: MeDetailed) => void;
follow: (payload: UserDetailedNotMe) => void;
followed: (payload: UserDetailed | UserLite) => void;
unfollow: (payload: UserDetailed) => void;
meUpdated: (payload: UserDetailed) => void;
pageEvent: (payload: PageEvent) => void;
urlUploadFinished: (payload: {
marker: string;
@@ -619,6 +619,7 @@ export type Channels = {
params: {
listId: string;
withFiles?: boolean;
withRenotes?: boolean;
};
events: {
note: (payload: Note) => void;
@@ -669,7 +670,7 @@ export type Channels = {
fileUpdated: (payload: DriveFile) => void;
folderCreated: (payload: DriveFolder) => void;
folderDeleted: (payload: DriveFolder['id']) => void;
folderUpdated: (payload: DriveFile) => void;
folderUpdated: (payload: DriveFolder) => void;
};
receives: null;
};
@@ -711,6 +712,46 @@ export type Channels = {
};
receives: null;
};
reversiGame: {
params: {
gameId: string;
};
events: {
started: (payload: {
game: ReversiGameDetailed;
}) => void;
ended: (payload: {
winnerId: User['id'] | null;
game: ReversiGameDetailed;
}) => void;
canceled: (payload: {
userId: User['id'];
}) => void;
changeReadyStates: (payload: {
user1: boolean;
user2: boolean;
}) => void;
updateSettings: (payload: {
userId: User['id'];
key: string;
value: any;
}) => void;
log: (payload: Record<string, any>) => void;
};
receives: {
putStone: {
pos: number;
id: string;
};
ready: boolean;
cancel: null | Record<string, never>;
updateSettings: {
key: string;
value: any;
};
claimTimeIsUp: null | Record<string, never>;
};
};
};
// @public (undocumented)
@@ -1695,6 +1736,7 @@ declare namespace entities {
Hashtag,
InviteCode,
Page,
PageBlock,
PageLike,
Channel,
QueueCount,
@@ -1710,6 +1752,7 @@ declare namespace entities {
Signin,
RoleLite,
Role,
RolePolicies,
ReversiGameLite,
ReversiGameDetailed,
AbuseUserReport
@@ -2558,6 +2601,9 @@ export const notificationTypes: readonly ["note", "follow", "mention", "reply",
// @public (undocumented)
type Page = components['schemas']['Page'];
// @public (undocumented)
type PageBlock = components['schemas']['PageBlock'];
// @public (undocumented)
type PageEvent = {
pageId: Page['id'];
@@ -2709,6 +2755,9 @@ type Role = components['schemas']['Role'];
// @public (undocumented)
type RoleLite = components['schemas']['RoleLite'];
// @public (undocumented)
type RolePolicies = components['schemas']['RolePolicies'];
// @public (undocumented)
type RolesListResponse = operations['roles/list']['responses']['200']['content']['application/json'];

View File

@@ -9,7 +9,7 @@
"devDependencies": {
"@misskey-dev/eslint-plugin": "^1.0.0",
"@readme/openapi-parser": "2.5.0",
"@types/node": "20.11.6",
"@types/node": "20.11.10",
"@typescript-eslint/eslint-plugin": "6.18.1",
"@typescript-eslint/parser": "6.18.1",
"eslint": "8.56.0",

View File

@@ -15,11 +15,10 @@
}
},
"scripts": {
"build": "npm run ts",
"ts": "npm run ts-esm && npm run ts-dts",
"ts-esm": "tsc --outDir built/esm",
"ts-dts": "tsc --outDir built/dts --declaration true --emitDeclarationOnly true --declarationMap true",
"watch": "nodemon -w src -e ts,js,cjs,mjs,json --exec \"pnpm run ts\"",
"build": "pnpm tsc-esm && pnpm tsc-dts",
"tsc-esm": "tsc --outDir built/esm",
"tsc-dts": "tsc --outDir built/dts --declaration true --emitDeclarationOnly true --declarationMap true",
"watch": "nodemon -w src -e ts,js,cjs,mjs,json --exec \"pnpm run build\"",
"tsd": "tsd",
"api": "pnpm api-extractor run --local --verbose",
"api-prod": "pnpm api-extractor run --verbose",
@@ -35,11 +34,11 @@
"url": "git+https://github.com/misskey-dev/misskey.js.git"
},
"devDependencies": {
"@microsoft/api-extractor": "7.39.3",
"@microsoft/api-extractor": "7.39.4",
"@misskey-dev/eslint-plugin": "1.0.0",
"@swc/jest": "0.2.31",
"@types/jest": "29.5.11",
"@types/node": "20.11.6",
"@types/node": "20.11.10",
"@typescript-eslint/eslint-plugin": "6.18.1",
"@typescript-eslint/parser": "6.18.1",
"eslint": "8.56.0",
@@ -59,7 +58,7 @@
],
"dependencies": {
"@swc/cli": "0.1.65",
"@swc/core": "1.3.105",
"@swc/core": "1.3.107",
"eventemitter3": "5.0.1",
"reconnecting-websocket": "4.4.0"
}

View File

@@ -30,6 +30,7 @@ export type Blocking = components['schemas']['Blocking'];
export type Hashtag = components['schemas']['Hashtag'];
export type InviteCode = components['schemas']['InviteCode'];
export type Page = components['schemas']['Page'];
export type PageBlock = components['schemas']['PageBlock'];
export type PageLike = components['schemas']['PageLike'];
export type Channel = components['schemas']['Channel'];
export type QueueCount = components['schemas']['QueueCount'];
@@ -45,6 +46,7 @@ export type FlashLike = components['schemas']['FlashLike'];
export type Signin = components['schemas']['Signin'];
export type RoleLite = components['schemas']['RoleLite'];
export type Role = components['schemas']['Role'];
export type RolePolicies = components['schemas']['RolePolicies'];
export type ReversiGameLite = components['schemas']['ReversiGameLite'];
export type ReversiGameDetailed = components['schemas']['ReversiGameDetailed'];
export type AbuseUserReport = components['schemas']['AbuseUserReport'];

View File

@@ -3797,33 +3797,7 @@ export type components = {
unlockedAt: number;
}[];
loggedInDays: number;
policies: {
gtlAvailable: boolean;
ltlAvailable: boolean;
canPublicNote: boolean;
canInvite: boolean;
inviteLimit: number;
inviteLimitCycle: number;
inviteExpirationTime: number;
canManageCustomEmojis: boolean;
canManageAvatarDecorations: boolean;
canSearchNotes: boolean;
canUseTranslator: boolean;
canUseDriveFileInSoundSettings: boolean;
canHideAds: boolean;
driveCapacityMb: number;
alwaysMarkNsfw: boolean;
pinLimit: number;
antennaLimit: number;
wordMuteLimit: number;
webhookLimit: number;
clipLimit: number;
noteEachClipsLimit: number;
userListLimit: number;
userEachUserListsLimit: number;
rateLimitFactor: number;
avatarDecorationLimit: number;
};
policies: components['schemas']['RolePolicies'];
email?: string | null;
emailVerified?: boolean | null;
securityKeysList?: {
@@ -3900,8 +3874,10 @@ export type components = {
text: string;
title: string;
imageUrl: string | null;
icon: string;
display: string;
/** @enum {string} */
icon: 'info' | 'warning' | 'error' | 'success';
/** @enum {string} */
display: 'dialog' | 'normal' | 'banner';
needConfirmationToRead: boolean;
forYou: boolean;
closeDuration: number;
@@ -3945,13 +3921,26 @@ export type components = {
reply?: components['schemas']['Note'] | null;
renote?: components['schemas']['Note'] | null;
isHidden?: boolean;
visibility: string;
/** @enum {string} */
visibility: 'public' | 'home' | 'followers' | 'specified';
mentions?: string[];
visibleUserIds?: string[];
fileIds?: string[];
files?: components['schemas']['DriveFile'][];
tags?: string[];
poll?: Record<string, never> | null;
poll?: ({
/** Format: date-time */
expiresAt?: string | null;
multiple: boolean;
choices: {
isVoted: boolean;
text: string;
votes: number;
}[];
}) | null;
emojis?: {
[key: string]: string;
};
/**
* Format: id
* @example xxxxxxxxxx
@@ -3967,14 +3956,19 @@ export type components = {
}) | null;
localOnly?: boolean;
reactionAcceptance: string | null;
reactions: Record<string, never>;
reactionEmojis: {
[key: string]: string;
};
reactions: {
[key: string]: number;
};
renoteCount: number;
repliesCount: number;
uri?: string;
url?: string;
reactionAndUserPairCache?: string[];
clippedCount?: number;
myReaction?: Record<string, never> | null;
myReaction?: string | null;
};
NoteReaction: {
/**
@@ -4005,21 +3999,162 @@ export type components = {
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'app' | 'test' | 'reaction:grouped' | 'renote:grouped';
user?: components['schemas']['UserLite'] | null;
type: 'note';
user: components['schemas']['UserLite'];
/** Format: id */
userId?: string | null;
note?: components['schemas']['Note'] | null;
reaction?: string | null;
achievement?: string;
body?: string | null;
header?: string | null;
icon?: string | null;
reactions?: {
userId: string;
note: components['schemas']['Note'];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'mention';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
note: components['schemas']['Note'];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'reply';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
note: components['schemas']['Note'];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'renote';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
note: components['schemas']['Note'];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'quote';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
note: components['schemas']['Note'];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'reaction';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
note: components['schemas']['Note'];
reaction: string;
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'pollEnded';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
note: components['schemas']['Note'];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'follow';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'receiveFollowRequest';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'followRequestAccepted';
user: components['schemas']['UserLite'];
/** Format: id */
userId: string;
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'roleAssigned';
role: components['schemas']['Role'];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'achievementEarned';
achievement: string;
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'app';
body: string;
header: string;
icon: string;
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'reaction:grouped';
note: components['schemas']['Note'];
reactions: {
user: components['schemas']['UserLite'];
reaction: string;
}[] | null;
users?: components['schemas']['UserLite'][] | null;
}[];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'renote:grouped';
note: components['schemas']['Note'];
users: components['schemas']['UserLite'][];
} | {
/** Format: id */
id: string;
/** Format: date-time */
createdAt: string;
/** @enum {string} */
type: 'test';
};
DriveFile: {
/**
@@ -4191,7 +4326,7 @@ export type components = {
/** Format: id */
userId: string;
user: components['schemas']['UserLite'];
content: Record<string, never>[];
content: components['schemas']['PageBlock'][];
variables: Record<string, never>[];
title: string;
name: string;
@@ -4206,6 +4341,29 @@ export type components = {
likedCount: number;
isLiked?: boolean;
};
PageBlock: OneOf<[{
id: string;
/** @enum {string} */
type: 'text';
text: string;
}, {
id: string;
/** @enum {string} */
type: 'section';
title: string;
children: components['schemas']['PageBlock'][];
}, {
id: string;
/** @enum {string} */
type: 'image';
fileId: string | null;
}, {
id: string;
/** @enum {string} */
type: 'note';
detailed: boolean;
note: string | null;
}]>;
PageLike: {
/**
* Format: id
@@ -4452,134 +4610,46 @@ export type components = {
/** @example false */
canEditMembersByModerator: boolean;
policies: {
pinLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canInvite: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
clipLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canHideAds: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
inviteLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
antennaLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
gtlAvailable: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
ltlAvailable: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
webhookLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canPublicNote: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
userListLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
wordMuteLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
alwaysMarkNsfw: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canSearchNotes: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
driveCapacityMb: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
rateLimitFactor: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
inviteLimitCycle: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
noteEachClipsLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
inviteExpirationTime: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canManageCustomEmojis: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
userEachUserListsLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canManageAvatarDecorations: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canUseDriveFileInSoundSettings: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canUseTranslator: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
avatarDecorationLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
[key: string]: {
value?: number | boolean;
priority?: number;
useDefault?: boolean;
};
};
usersCount: number;
});
RolePolicies: {
gtlAvailable: boolean;
ltlAvailable: boolean;
canPublicNote: boolean;
canCreateContent: boolean;
canUpdateContent: boolean;
canDeleteContent: boolean;
canUpdateAvatar: boolean;
canUpdateBanner: boolean;
canInvite: boolean;
inviteLimit: number;
inviteLimitCycle: number;
inviteExpirationTime: number;
canManageCustomEmojis: boolean;
canManageAvatarDecorations: boolean;
canSearchNotes: boolean;
canUseTranslator: boolean;
canUseDriveFileInSoundSettings: boolean;
canHideAds: boolean;
driveCapacityMb: number;
alwaysMarkNsfw: boolean;
pinLimit: number;
antennaLimit: number;
wordMuteLimit: number;
webhookLimit: number;
clipLimit: number;
noteEachClipsLimit: number;
userListLimit: number;
userEachUserListsLimit: number;
rateLimitFactor: number;
avatarDecorationLimit: number;
};
ReversiGameLite: {
/** Format: id */
id: string;
@@ -11503,14 +11573,18 @@ export type operations = {
200: {
content: {
'application/json': {
'local.incCount': number[];
'local.incSize': number[];
'local.decCount': number[];
'local.decSize': number[];
'remote.incCount': number[];
'remote.incSize': number[];
'remote.decCount': number[];
'remote.decSize': number[];
local: {
incCount: number[];
incSize: number[];
decCount: number[];
decSize: number[];
};
remote: {
incCount: number[];
incSize: number[];
decCount: number[];
decSize: number[];
};
};
};
};
@@ -11638,30 +11712,44 @@ export type operations = {
200: {
content: {
'application/json': {
'requests.failed': number[];
'requests.succeeded': number[];
'requests.received': number[];
'notes.total': number[];
'notes.inc': number[];
'notes.dec': number[];
'notes.diffs.normal': number[];
'notes.diffs.reply': number[];
'notes.diffs.renote': number[];
'notes.diffs.withFile': number[];
'users.total': number[];
'users.inc': number[];
'users.dec': number[];
'following.total': number[];
'following.inc': number[];
'following.dec': number[];
'followers.total': number[];
'followers.inc': number[];
'followers.dec': number[];
'drive.totalFiles': number[];
'drive.incFiles': number[];
'drive.decFiles': number[];
'drive.incUsage': number[];
'drive.decUsage': number[];
requests: {
failed: number[];
succeeded: number[];
received: number[];
};
notes: {
total: number[];
inc: number[];
dec: number[];
diffs: {
normal: number[];
reply: number[];
renote: number[];
withFile: number[];
};
};
users: {
total: number[];
inc: number[];
dec: number[];
};
following: {
total: number[];
inc: number[];
dec: number[];
};
followers: {
total: number[];
inc: number[];
dec: number[];
};
drive: {
totalFiles: number[];
incFiles: number[];
decFiles: number[];
incUsage: number[];
decUsage: number[];
};
};
};
};
@@ -11721,20 +11809,28 @@ export type operations = {
200: {
content: {
'application/json': {
'local.total': number[];
'local.inc': number[];
'local.dec': number[];
'local.diffs.normal': number[];
'local.diffs.reply': number[];
'local.diffs.renote': number[];
'local.diffs.withFile': number[];
'remote.total': number[];
'remote.inc': number[];
'remote.dec': number[];
'remote.diffs.normal': number[];
'remote.diffs.reply': number[];
'remote.diffs.renote': number[];
'remote.diffs.withFile': number[];
local: {
total: number[];
inc: number[];
dec: number[];
diffs: {
normal: number[];
reply: number[];
renote: number[];
withFile: number[];
};
};
remote: {
total: number[];
inc: number[];
dec: number[];
diffs: {
normal: number[];
reply: number[];
renote: number[];
withFile: number[];
};
};
};
};
};
@@ -11863,18 +11959,30 @@ export type operations = {
200: {
content: {
'application/json': {
'local.followings.total': number[];
'local.followings.inc': number[];
'local.followings.dec': number[];
'local.followers.total': number[];
'local.followers.inc': number[];
'local.followers.dec': number[];
'remote.followings.total': number[];
'remote.followings.inc': number[];
'remote.followings.dec': number[];
'remote.followers.total': number[];
'remote.followers.inc': number[];
'remote.followers.dec': number[];
local: {
followings: {
total: number[];
inc: number[];
dec: number[];
};
followers: {
total: number[];
inc: number[];
dec: number[];
};
};
remote: {
followings: {
total: number[];
inc: number[];
dec: number[];
};
followers: {
total: number[];
inc: number[];
dec: number[];
};
};
};
};
};
@@ -11939,10 +12047,12 @@ export type operations = {
total: number[];
inc: number[];
dec: number[];
'diffs.normal': number[];
'diffs.reply': number[];
'diffs.renote': number[];
'diffs.withFile': number[];
diffs: {
normal: number[];
reply: number[];
renote: number[];
withFile: number[];
};
};
};
};
@@ -12004,10 +12114,14 @@ export type operations = {
200: {
content: {
'application/json': {
'upv.user': number[];
'pv.user': number[];
'upv.visitor': number[];
'pv.visitor': number[];
upv: {
user: number[];
visitor: number[];
};
pv: {
user: number[];
visitor: number[];
};
};
};
};
@@ -12069,8 +12183,12 @@ export type operations = {
200: {
content: {
'application/json': {
'local.count': number[];
'remote.count': number[];
local: {
count: number[];
};
remote: {
count: number[];
};
};
};
};
@@ -12130,12 +12248,16 @@ export type operations = {
200: {
content: {
'application/json': {
'local.total': number[];
'local.inc': number[];
'local.dec': number[];
'remote.total': number[];
'remote.inc': number[];
'remote.dec': number[];
local: {
total: number[];
inc: number[];
dec: number[];
};
remote: {
total: number[];
inc: number[];
dec: number[];
};
};
};
};
@@ -19460,6 +19582,7 @@ export type operations = {
privacyPolicyUrl: string | null;
serverRules: string[];
themeColor: string | null;
policies: components['schemas']['RolePolicies'];
};
};
};
@@ -26075,7 +26198,14 @@ export type operations = {
/** @description OK (with results) */
200: {
content: {
'application/json': unknown;
'application/json': {
/** Format: date-time */
createdAt: string;
users: number;
data: {
[key: string]: number;
};
}[];
};
};
/** @description Client error */

View File

@@ -2,11 +2,13 @@ import {
Antenna,
DriveFile,
DriveFolder,
MeDetailed,
Note,
Notification,
Signin,
User,
UserDetailed,
UserDetailedNotMe,
UserLite,
} from './autogen/models.js';
import {
AnnouncementCreated,
@@ -17,6 +19,7 @@ import {
QueueStatsLog,
ServerStats,
ServerStatsLog,
ReversiGameDetailed,
} from './entities.js';
export type Channels = {
@@ -27,10 +30,10 @@ export type Channels = {
mention: (payload: Note) => void;
reply: (payload: Note) => void;
renote: (payload: Note) => void;
follow: (payload: User) => void; // 自分が他人をフォローしたとき
followed: (payload: User) => void; // 他人が自分をフォローしたとき
unfollow: (payload: User) => void; // 自分が他人をフォロー解除したとき
meUpdated: (payload: MeDetailed) => void;
follow: (payload: UserDetailedNotMe) => void; // 自分が他人をフォローしたとき
followed: (payload: UserDetailed | UserLite) => void; // 他人が自分をフォローしたとき
unfollow: (payload: UserDetailed) => void; // 自分が他人をフォロー解除したとき
meUpdated: (payload: UserDetailed) => void;
pageEvent: (payload: PageEvent) => void;
urlUploadFinished: (payload: { marker: string; file: DriveFile; }) => void;
readAllNotifications: () => void;
@@ -102,6 +105,7 @@ export type Channels = {
params: {
listId: string;
withFiles?: boolean;
withRenotes?: boolean;
};
events: {
note: (payload: Note) => void;
@@ -152,7 +156,7 @@ export type Channels = {
fileUpdated: (payload: DriveFile) => void;
folderCreated: (payload: DriveFolder) => void;
folderDeleted: (payload: DriveFolder['id']) => void;
folderUpdated: (payload: DriveFile) => void;
folderUpdated: (payload: DriveFolder) => void;
};
receives: null;
};
@@ -193,6 +197,32 @@ export type Channels = {
}
};
receives: null;
};
reversiGame: {
params: {
gameId: string;
};
events: {
started: (payload: { game: ReversiGameDetailed; }) => void;
ended: (payload: { winnerId: User['id'] | null; game: ReversiGameDetailed; }) => void;
canceled: (payload: { userId: User['id']; }) => void;
changeReadyStates: (payload: { user1: boolean; user2: boolean; }) => void;
updateSettings: (payload: { userId: User['id']; key: string; value: any; }) => void;
log: (payload: Record<string, any>) => void;
};
receives: {
putStone: {
pos: number;
id: string;
};
ready: boolean;
cancel: null | Record<string, never>;
updateSettings: {
key: string;
value: any;
};
claimTimeIsUp: null | Record<string, never>;
}
}
};