Реакции
Обзор
Модуль «Реакции» позволяет игрокам оставлять на сущностях реакции с произвольным типом — например like / dislike, условные «эмодзи» в виде строк (heart, poop, lol) или служебные метки вроде view («просмотрено»). Для каждой сущности в данных доступны:
reactions— объект тип реакции → сколько всего таких реакций от всех игроков (агрегированные счётчики).playerReactions— список реакций, которые текущий игрок поставил именно на эту сущность.
На стороне сервиса запоминается, ставил ли игрок данную реакцию на данную сущность — это можно использовать для лайков, голосований, отметок «просмотрено» и панелей с «эмодзи».
Реакции поддерживаются для:
reactionType — произвольная строка. Зафиксируйте набор ключей в игре (like, dislike, heart, view и т.д.), чтобы интерфейс и аналитика не расходились.
Поставить реакцию
+1 RequestДобавляет реакцию текущего игрока к сущности (поведение при повторной установке зависит от правил на сервере).
- JavaScript
- Construct 3
await gp.reactions.set({
// Тип сущности: "CHANNEL" | "CHANNEL_MESSAGE" | "FILE" | "IMAGE"
entityType: 'FILE',
// ID сущности (строка; тот же формат, что в остальном API)
entityId: '12333',
// Любой идентификатор реакции, который вы используете в игре
reactionType: 'like',
});
Легенда
System
GamePush
Text
System›Системный объект Construct 3
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Примеры: like / dislike у сообщения в канале
- JavaScript
- Construct 3
const messageId = '884422';
await gp.reactions.set({
entityType: 'CHANNEL_MESSAGE',
entityId: messageId,
reactionType: 'like',
});
await gp.reactions.set({
entityType: 'CHANNEL_MESSAGE',
entityId: messageId,
reactionType: 'dislike',
});
Легенда
System
GamePush
System›Системный объект Construct 3
GamePush›Плагин GamePush
Примеры: «эмодзи» как строки
- JavaScript
- Construct 3
// heart, poop, lol — только имена; иконки сопоставляйте на клиенте
await gp.reactions.set({
entityType: 'IMAGE',
entityId: '771209',
reactionType: 'heart',
});
await gp.reactions.set({
entityType: 'IMAGE',
entityId: '771209',
reactionType: 'poop',
});
await gp.reactions.set({
entityType: 'CHANNEL_MESSAGE',
entityId: '112233',
reactionType: 'lol',
});
Легенда
System
GamePush
System›Системный объект Construct 3
GamePush›Плагин GamePush
Снять реакцию
+1 RequestСнимает у текущего игрока реакцию указанного типа с сущности.
- JavaScript
- Construct 3
await gp.reactions.unset({
entityType: 'FILE',
entityId: '12333',
reactionType: 'like',
});
Легенда
System
GamePush
Text
System›Системный объект Construct 3
GamePush›Плагин GamePush
Text — Объект Text (Текст)
События
Подписка на успешные операции и ошибки.
- JavaScript
- Construct 3
gp.reactions.on('set', ({ entityType, entityId, reactionType, counter }) => {
// counter — обновлённое суммарное количество этой реакции на сущности
});
gp.reactions.on('unset', ({ entityType, entityId, reactionType, counter }) => {});
gp.reactions.on('set:error', (error) => {});
gp.reactions.on('unset:error', (error) => {});
Нотификации в реальном времени
Отдельно доступны нотификации о реакциях в реальном времени. Они позволяют видеть, как другие игроки ставят и убирают реакции, пока вы находитесь в канале.
Сейчас эти события работают только для сущности сообщения канала.
gp.reactions.on('event:set', ({ entityType, entityId, reactionType, counter }) => {
// counter — обновлённое суммарное количество этой реакции на сущности
});
gp.reactions.on('event:unset', ({ entityType, entityId, reactionType, counter }) => {
// counter — обновлённое суммарное количество этой реакции на сущности
});
Легенда
GamePush
Text
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Счётчики и реакции игрока
После загрузки сущности обычными методами (fetchChannel, fetchMessages, files.fetch, images.fetch и т.д.) доступны:
- Сумма по всем игрокам:
entity.reactions[reactionType]. - Текущий игрок: массив
entity.playerReactions— проверяйте полеreactionType.
- JavaScript
- Construct 3
const channel = await gp.channels.fetchChannel({ channelId: 123 });
const likesCount = channel.reactions.like ?? 0;
const hasLike = channel.playerReactions.some((r) => r.reactionType === 'like');
Легенда
System
GP_Channels
GamePush
Text
System›Системный объект Construct 3
GP_Channels›Плагин GamePush Channels
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Канал
- JavaScript
- Construct 3
const channel = await gp.channels.fetchChannel({ channelId: 123 });
const upvotes = channel.reactions.like ?? 0;
const downvotes = channel.reactions.dislike ?? 0;
const playerLiked = channel.playerReactions.some((r) => r.reactionType === 'like');
Легенда
System
GP_Channels
GamePush
Text
System›Системный объект Construct 3
GP_Channels›Плагин GamePush Channels
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Сообщение канала
Используйте id сообщения из загрузки сообщений — тот же идентификатор передаётся в entityId для типа CHANNEL_MESSAGE.
- JavaScript
- Construct 3
const { items: messages } = await gp.channels.fetchMessages({ channelId: 123 });
messages.forEach((message) => {
const heartCount = message.reactions.heart ?? 0;
const playerSentHeart = message.playerReactions.some((r) => r.reactionType === 'heart');
});
Легенда
System
GP_Channels
GamePush
Text
System›Системный объект Construct 3
GP_Channels›Плагин GamePush Channels
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Файл
- JavaScript
- Construct 3
const { items: files } = await gp.files.fetch();
const file = files.find((f) => String(f.id) === '12333');
if (file) {
const likes = file.reactions.like ?? 0;
const iLiked = file.playerReactions.some((r) => r.reactionType === 'like');
}
Легенда
System
GamePush
Text
System›Системный объект Construct 3
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Картинка
- JavaScript
- Construct 3
const { items: images } = await gp.images.fetch();
const image = images.find((img) => String(img.id) === '771209');
if (image) {
const lolCount = image.reactions.lol ?? 0;
const playerLol = image.playerReactions.some((r) => r.reactionType === 'lol');
}
Легенда
System
GamePush
Text
System›Системный объект Construct 3
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Пример: «просмотрено» для файла
Отдельный тип реакции (например view) можно использовать как флаг «игрок открывал этот файл»: поставьте реакцию при просмотре, затем при следующей загрузке списка проверяйте playerReactions.
- JavaScript
- Construct 3
const fileId = '55501';
// Когда игрок открыл просмотр документа
await gp.reactions.set({
entityType: 'FILE',
entityId: fileId,
reactionType: 'view',
});
// Позже: после fetch проверить, просматривал ли этот игрок файл
const { items } = await gp.files.fetch();
const file = items.find((f) => String(f.id) === fileId);
const totalViews = file?.reactions.view ?? 0;
const playerHasViewed = file?.playerReactions.some((r) => r.reactionType === 'view') ?? false;
Легенда
System
GamePush
Text
System›Системный объект Construct 3
GamePush›Плагин GamePush
Text — Объект Text (Текст)
Снять отметку у текущего игрока (если это нужно по геймдизайну):
- JavaScript
- Construct 3
await gp.reactions.unset({
entityType: 'FILE',
entityId: fileId,
reactionType: 'view',
});
Легенда
System
GamePush
System›Системный объект Construct 3
GamePush›Плагин GamePush
Типы данных
Значения entityType
| Значение | Сущность |
|---|---|
CHANNEL | Канал |
CHANNEL_MESSAGE | Сообщение канала |
FILE | Файл |
IMAGE | Картинка |
Поля на сущностях
| Поле | Тип | Описание |
|---|---|---|
reactions | Record<string, number> | Счётчики по reactionType по всем игрокам |
playerReactions | Array<{ reactionType: string, ... }> | Реакции текущего игрока на эту сущность |
Дополнительные поля в элементах playerReactions могут появиться в GamePush SDK; для проверок опирайтесь на reactionType.
Оставайтесь на связи
С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.
Сообщество GamePush в Telegram: @gs_community.
Для ваших обращений e-mail: official@gamepush.com
Желаем вам успехов!