Обратная связь
Обзор
С GamePush вы можете организовать систему обратной связи от игроков. Игроки могут отправлять фидбеки (ошибки, жалобы, предложения, отзывы) с прикрепленными файлами (скриншоты, видео), а вы сможете просматривать их в админ-панели и отвечать на них через чат.
Фидбеки автоматически отправляются как разработчику игры, так и платформе (если она партнерская), что позволяет оперативно реагировать на проблемы игроков.

Пример
Работа в панели управления

В разделе "Обратная связь" вашего проекта вы можете:
- Просматривать список фидбеков от игроков
- Видеть с какой площадки создали обращение
- Видеть привязанного игрока для оперативного просмотра
- Общаться с площадкой и игроком в чате обращения
- Управлять статусом фидбека: устанавливать решенный / нерешенный статус или в работе
При общении в чате вы можете скрывать для игрока ваше сообщение. Его будете видеть только вы и площадка.
Отправить фидбек
+1 RequestОтправить фидбек с текстом и прикрепленными файлами (скриншоты, видео). Фидбек автоматически будет отправлен разработчику игры и платформе (если она партнерская).
- JavaScript
- Unity
const feedback = await gp.feedbacks.send({
// Тип фидбека: "ERROR" | "COMPLAINT" | "SUGGESTION" | "REVIEW"
type: 'ERROR',
// Текст фидбека
text: 'Эти нубоки не как все нубоки',
// Прикрепленные файлы, загружайте как показано в разделе "Файлы"
files: ['https://example.com/image.png', 'https://example.com/video.mp4'],
// User-Agent (необязательно, определяется автоматически)
userAgent: 'Custom User Agent',
});
FeedbackData data = new FeedbackData
{
// Тип фидбека: "ERROR" | "COMPLAINT" | "SUGGESTION" | "REVIEW"
type = "ERROR",
// Текст фидбека
text = "Эти нубоки не как все нубоки",
// Прикрепленные файлы (URL-ы)
files = new string[] { "https://example.com/image.png", "https://example.com/video.mp4" }
};
GP_Feedbacks.Send(data, OnSendFeedback, OnSendFeedbackError);
Для загрузки файлов воспользуйтесь модулем "Файлы". Загрузите файл и получите ссылку, укажите ссылку в обращении.
Метод возвращает данные фидбека:
- JavaScript
- Unity
const feedback = await gp.feedbacks.send({
type: 'ERROR',
text: 'Эти нубоки не как все нубоки',
files: ['https://example.com/image.png'],
});
/**
* ID фидбека
* @type {number}
*/
feedback.id;
/**
* Тип фидбека
* @type {"ERROR" | "COMPLAINT" | "SUGGESTION" | "REVIEW"}
*/
feedback.type;
/**
* Текст фидбека
* @type {string}
*/
feedback.text;
/**
* Статус фидбека
* @type {"NEW" | "IN_PROGRESS" | "RESOLVED" | "UNRESOLVED" | "REQUIRES_ACTION"}
*/
feedback.status;
/**
* Сообщения в фидбеке
* @type {Array<Message>}
*/
feedback.messages;
private void OnSendFeedback(FeedbackData feedback)
{
Debug.Log("ID: " + feedback.id);
Debug.Log("Type: " + feedback.type);
Debug.Log("Text: " + feedback.text);
Debug.Log("Status: " + feedback.status);
}
События отправки фидбека:
- JavaScript
- Unity
// Фидбек успешно отправлен
gp.feedbacks.on('createFeedback', (feedback) => {});
/**
* Ошибка при отправке фидбека
* @type {
* 'player_not_found' - аккаунт игрока еще не создан
* 'project_not_found' - не совпал ID игры или игра не существует
* 'empty_text' - не указан текст фидбека
* 'empty_type' - не указан тип фидбека
* 'invalid_type' - неверный тип фидбека
* 'origin_not_allowed' - запрещенный origin
* 'internal_error' - что-то пошло не так
* other - любая ошибка не связанная с сервисом
* }
*/
gp.feedbacks.on('error:createFeedback', (error) => {});
private void OnSendFeedbackError(string error)
{
Debug.Log("ERROR: " + error);
}
Открыть список фидбеков
+1 RequestОткрыть готовое окно со списком фидбеков с кнопкой "Написать нам". Можно отфильтровать по типу и статусу.
- JavaScript
- Unity
// Открыть все фидбеки
await gp.feedbacks.open();
// Открыть фидбеки с фильтрацией
await gp.feedbacks.open({
// Тип фидбека (необязательно)
type: 'ERROR',
// Статус фидбека (необязательно)
status: 'IN_PROGRESS',
});
// Открыть все фидбеки
GP_Feedbacks.Open();
// Открыть фидбеки с фильтрацией
GP_Feedbacks.Open(
type: "ERROR",
status: "IN_PROGRESS"
);
События открытия окна:
- JavaScript
- Unity
// Окно открыто
gp.feedbacks.on('openFeedbacksList', () => {});
// Ошибка при открытии окна
gp.feedbacks.on('error:openFeedbacksList', (error) => {});
GP_Feedbacks.Open(OnOpenFeedbacksList, OnOpenFeedbacksListError);
private void OnOpenFeedbacksList() => Debug.Log("ON OPEN FEEDBACKS LIST");
private void OnOpenFeedbacksListError(string error) => Debug.Log("ON OPEN FEEDBACKS LIST: ERROR: " + error);
Открыть определенный фидбек
+1 RequestОткрыть готовое окно с конкретным фидбеком и его сообщениями.
- JavaScript
- Unity
await gp.feedbacks.openFeedback({
// ID фидбека (строка)
feedbackId: 'xyzv-14444-hexa-151p',
});
GP_Feedbacks.OpenFeedback("14444", OnOpenFeedback, OnOpenFeedbackError);
private void OnOpenFeedback() => Debug.Log("ON OPEN FEEDBACK");
private void OnOpenFeedbackError(string error) => Debug.Log("ON OPEN FEEDBACK: ERROR: " + error);
Получить список фидбеков
+1 RequestПолучить список фидбеков для отображения в своей интерфейсе. Можно отфильтровать по типу и статусу.
- JavaScript
- Unity
// Получить все фидбеки
const result = await gp.feedbacks.fetch();
// Получить фидбеки с фильтрацией
const result = await gp.feedbacks.fetch({
// Лимит количества фидбеков (по умолчанию 20)
limit: 20,
// Тип фидбека (необязательно)
type: 'ERROR',
// Статус фидбека (необязательно)
status: 'IN_PROGRESS',
});
/**
* Список фидбеков
* @type {Array<Feedback>}
*/
const myFeedbacks = result.items;
/**
* Можно ли загрузить еще фидбеков
* @type {boolean}
*/
const canLoadMore = result.canLoadMore;
myFeedbacks.forEach((feedback) => {
// ID фидбека
feedback.id;
// Тип фидбека
feedback.type;
// Текст фидбека
feedback.text;
// Статус фидбека
feedback.status;
// Сообщения в фидбеке
feedback.messages.forEach((message) => {
// ID сообщения
message.id;
// Текст сообщения
message.text;
// Прикрепленные файлы
message.attachments;
// Автор сообщения: "system" | "player"
message.author;
// ID фидбека
message.feedbackId;
// Дата создания
message.createdAt;
});
});
// Получить все фидбеки
GP_Feedbacks.Fetch(OnFetchFeedbacks, OnFetchFeedbacksError);
// Получить фидбеки с фильтрацией
GP_Feedbacks.Fetch(
type: "ERROR",
status: "IN_PROGRESS",
OnFetchFeedbacks,
OnFetchFeedbacksError
);
private void OnFetchFeedbacks(FeedbackData[] feedbacks)
{
foreach (FeedbackData feedback in feedbacks)
{
Debug.Log("ID: " + feedback.id);
Debug.Log("Type: " + feedback.type);
Debug.Log("Text: " + feedback.text);
Debug.Log("Status: " + feedback.status);
foreach (MessageData message in feedback.messages)
{
Debug.Log("Message ID: " + message.id);
Debug.Log("Message Text: " + message.text);
Debug.Log("Message Author: " + message.author);
}
}
}
События получения списка фидбеков:
- JavaScript
- Unity
// Список фидбеков успешно получен
gp.feedbacks.on('fetchFeedbacks', (result) => {
// result.items - массив фидбеков
// result.canLoadMore - можно ли загрузить еще
});
/**
* Ошибка при получении списка фидбеков
* @type {
* 'player_not_found' - аккаунт игрока еще не создан
* 'project_not_found' - не совпал ID игры или игра не существует
* 'origin_not_allowed' - запрещенный origin
* 'internal_error' - что-то пошло не так
* other - любая ошибка не связанная с сервисом
* }
*/
gp.feedbacks.on('error:fetchFeedbacks', (error) => {});
private void OnFetchFeedbacksError(string error)
{
Debug.Log("ERROR: " + error);
}
Загрузить еще
+1 RequestЗагрузить следующую порцию фидбеков для пагинации. Используется после метода fetch.
- JavaScript
- Unity
// Загрузить еще фидбеки с теми же фильтрами
const result = await gp.feedbacks.fetchMore({
// Лимит количества фидбеков (по умолчанию 20)
limit: 20,
// Тип фидбека (необязательно)
type: 'ERROR',
// Статус фидбека (необязательно)
status: 'IN_PROGRESS',
});
/**
* Список фидбеков
* @type {Array<Feedback>}
*/
const moreFeedbacks = result.items;
/**
* Можно ли загрузить еще фидбеков
* @type {boolean}
*/
const canLoadMore = result.canLoadMore;
GP_Feedbacks.FetchMore(
limit: 20,
type: "ERROR",
status: "IN_PROGRESS",
OnFetchMoreFeedbacks,
OnFetchMoreFeedbacksError
);
private void OnFetchMoreFeedbacks(FeedbackData[] feedbacks)
{
foreach (FeedbackData feedback in feedbacks)
{
Debug.Log("ID: " + feedback.id);
}
}
События загрузки дополнительных фидбеков:
- JavaScript
- Unity
// Дополнительные фидбеки успешно получены
gp.feedbacks.on('fetchMoreFeedbacks', (result) => {
// result.items - массив фидбеков
// result.canLoadMore - можно ли загрузить еще
});
/**
* Ошибка при загрузке дополнительных фидбеков
* @type {
* 'player_not_found' - аккаунт игрока еще не создан
* 'project_not_found' - не совпал ID игры или игра не существует
* 'origin_not_allowed' - запрещенный origin
* 'internal_error' - что-то пошло не так
* other - любая ошибка не связанная с сервисом
* }
*/
gp.feedbacks.on('error:fetchMoreFeedbacks', (error) => {});
private void OnFetchMoreFeedbacksError(string error)
{
Debug.Log("ERROR: " + error);
}
Отправить сообщение в чат
+1 RequestОтправить сообщение в чат фидбека. Сообщение будет видно разработчику и платформе (если она партнерская).
- JavaScript
- Unity
const message = await gp.feedbacks.sendMessage({
// ID фидбека
feedbackId: '352352',
// Текст сообщения
text: 'К сожалению, проблема осталась :(',
// Прикрепленные файлы (необязательно, File объекты)
files: [],
});
MessageData data = new MessageData
{
// ID фидбека
feedbackId = "352352",
// Текст сообщения
text = "К сожалению, проблема осталась :(",
// Прикрепленные файлы (необязательно)
files = new string[] { }
};
GP_Feedbacks.SendMessage(data, OnSendMessage, OnSendMessageError);
Метод возвращает данные отправленного сообщения:
- JavaScript
- Unity
const message = await gp.feedbacks.sendMessage({
feedbackId: '352352',
text: 'К сожалению, проблема осталась :(',
files: [],
});
// message.id - ID сообщения
// message.text - текст сообщения
// message.feedbackId - ID фидбека
// message.author - автор сообщения
// message.attachments - прикрепленные файлы
private void OnSendMessage(MessageData message)
{
Debug.Log("Message ID: " + message.id);
Debug.Log("Message Text: " + message.text);
Debug.Log("Feedback ID: " + message.feedbackId);
}
События отправки сообщения:
- JavaScript
- Unity
// Сообщение успешно отправлено
gp.feedbacks.on('sendMessage', (feedback) => {});
/**
* Ошибка при отправке сообщения
* @type {
* 'player_not_found' - аккаунт игрока еще не создан
* 'project_not_found' - не совпал ID игры или игра не существует
* 'feedback_not_found' - фидбек не найден
* 'empty_text' - не указан текст сообщения
* 'origin_not_allowed' - запрещенный origin
* 'internal_error' - что-то пошло не так
* other - любая ошибка не связанная с сервисом
* }
*/
gp.feedbacks.on('error:sendMessage', (error) => {});
private void OnSendMessageError(string error)
{
Debug.Log("ERROR: " + error);
}
Подписка на события
FREEПодписаться на уведомления в реальном времени о событиях обратной связи.
Должна быть включена опция "Разрешить игрокам подключаться к онлайн службе" в разделе Каналы вашего проекта.
Новое сообщение в фидбеке
- JavaScript
- Unity
gp.feedbacks.on('event:feedbackMessage', (message) => {
// ID сообщения
message.id;
// Текст сообщения
message.text;
// Прикрепленные файлы
message.attachments;
// Автор сообщения: "system" | "player"
message.author;
// ID фидбека
message.feedbackId;
// Дата создания
message.createdAt;
});
private void OnEnable()
{
GP_Feedbacks.OnFeedbackMessage += OnFeedbackMessage;
}
private void OnDisable()
{
GP_Feedbacks.OnFeedbackMessage -= OnFeedbackMessage;
}
private void OnFeedbackMessage(MessageData message)
{
Debug.Log("Message ID: " + message.id);
Debug.Log("Message Text: " + message.text);
Debug.Log("Message Author: " + message.author);
Debug.Log("Feedback ID: " + message.feedbackId);
}
Фидбек создан
- JavaScript
- Unity
gp.feedbacks.on('event:feedbackCreated', (feedback) => {
// ID фидбека
feedback.id;
// Тип фидбека
feedback.type;
// Текст фидбека
feedback.text;
// Статус фидбека
feedback.status;
});
private void OnEnable()
{
GP_Feedbacks.OnFeedbackCreated += OnFeedbackCreated;
}
private void OnDisable()
{
GP_Feedbacks.OnFeedbackCreated -= OnFeedbackCreated;
}
private void OnFeedbackCreated(FeedbackData feedback)
{
Debug.Log("Feedback Created ID: " + feedback.id);
}
Статус фидбека обновлен
- JavaScript
- Unity
// Статус фидбека обновлен разработчиком
gp.feedbacks.on('event:feedbackStatusUpdated', (feedback) => {
// ID фидбека
feedback.id;
// Новый статус фидбека
feedback.status;
});
// Статус фидбека обновлен платформой
gp.feedbacks.on('event:feedbackPlatformStatusUpdated', (feedback) => {
// ID фидбека
feedback.id;
// Новый статус фидбека
feedback.status;
});
private void OnEnable()
{
GP_Feedbacks.OnFeedbackStatusUpdated += OnFeedbackStatusUpdated;
GP_Feedbacks.OnFeedbackPlatformStatusUpdated += OnFeedbackPlatformStatusUpdated;
}
private void OnDisable()
{
GP_Feedbacks.OnFeedbackStatusUpdated -= OnFeedbackStatusUpdated;
GP_Feedbacks.OnFeedbackPlatformStatusUpdated -= OnFeedbackPlatformStatusUpdated;
}
private void OnFeedbackStatusUpdated(FeedbackData feedback)
{
Debug.Log("Feedback Status Updated ID: " + feedback.id);
Debug.Log("New Status: " + feedback.status);
}
private void OnFeedbackPlatformStatusUpdated(FeedbackData feedback)
{
Debug.Log("Feedback Platform Status Updated ID: " + feedback.id);
Debug.Log("New Status: " + feedback.status);
}
Типы
Поля фидбека
| Поле | Тип | Описание |
|---|---|---|
id | number | ID фидбека |
type | "ERROR" | "COMPLAINT" | "SUGGESTION" | "REVIEW" | Тип фидбека |
text | string | Текст фидбека |
status | "NEW" | "IN_PROGRESS" | "RESOLVED" | "UNRESOLVED" | Статус фидбека |
messages | Array<Message> | Сообщения в фидбеке |
playerId | number | ID игрока |
projectId | number | ID проекта |
platformId | number | ID платформы |
createdAt | string | Дата создания |
updatedAt | string | Дата обновления |
Типы фидбеков
ERROR- ОшибкаCOMPLAINT- ЖалобаSUGGESTION- ПредложениеREVIEW- Отзыв
Статусы фидбеков
NEW- НовыйIN_PROGRESS- В работеRESOLVED- РешенUNRESOLVED- Не решен
Поля сообщения
| Поле | Тип | Описание |
|---|---|---|
id | number | ID сообщения |
text | string | Текст сообщения |
attachments | Array<string> | Прикрепленные файлы (URL-ы) |
author | "PLAYER" | "PLATFORM" | "MODERATOR" | "ADMIN" | Автор сообщения |
feedbackId | number | ID фидбека |
createdAt | string | Дата создания |
Авторы сообщения
PLAYER- ИгрокPLATFORM- Представитель площадкиMODERATOR- Представитель нашего сервисаADMIN- Разработчик игры
Вебхуки
Вы можете настроить вебхуки для получения уведомлений о событиях обратной связи. Подробнее о настройке вебхуков читайте в разделе Вебхуки.
События вебхуков
| Тип события | Описание |
|---|---|
PlayerSendFeedback | Игрок отправил фидбек |
PlayerSendFeedbackMessage | Игрок отправил сообщение в фидбек |
PlatformSendFeedbackMessage | Платформа отправила сообщение в фидбек |
AdminSendFeedbackMessage | Разработчик отправил сообщение в фидбек |
FeedbackStatusChanged | Статус фидбека изменился |
Пример данных вебхука
{
"event": "PlayerSendFeedback",
"player": {
"id": 1820283,
"name": "Player Name",
"avatar": "",
"projectId": 4,
"credentials": "",
"platformType": "VK",
"active": true,
"removed": false,
"test": false,
"modifiedAt": "2024-04-26T11:34:23.415923998Z"
},
"result": {
"__typename": "Feedback",
"id": 14444,
"type": "ERROR",
"text": "Эти нубоки не как все нубоки",
"status": "NEW",
"projectId": 4,
"platformId": 1
},
"time": "2024-04-26T11:34:23.415923998Z"
}
Оставайтесь на связи
С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.
Сообщество GamePush в Telegram: @gs_community.
Для ваших обращений e-mail: official@gamepush.com
Желаем вам успехов!