mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-22 17:45:09 -07:00
[Client] Keep the message draft and notify when the recipient is offline (#7142)
* [Client] Keep the message draft and notify when the recipient is offline * Don't blindly assume a user is online. --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
6c8fcf7d19
commit
f466a25893
3 changed files with 35 additions and 7 deletions
|
|
@ -23,9 +23,10 @@
|
|||
TabMessage::TabMessage(TabSupervisor *_tabSupervisor,
|
||||
AbstractClient *_client,
|
||||
const ServerInfo_User &_ownUserInfo,
|
||||
const ServerInfo_User &_otherUserInfo)
|
||||
const ServerInfo_User &_otherUserInfo,
|
||||
bool _userOnline)
|
||||
: Tab(_tabSupervisor), client(_client), ownUserInfo(new ServerInfo_User(_ownUserInfo)),
|
||||
otherUserInfo(new ServerInfo_User(_otherUserInfo)), userOnline(true)
|
||||
otherUserInfo(new ServerInfo_User(_otherUserInfo)), userOnline(_userOnline)
|
||||
{
|
||||
chatView = new ChatView(tabSupervisor, 0, true);
|
||||
connect(chatView, &ChatView::showCardInfoPopup, this, &TabMessage::showCardInfoPopup);
|
||||
|
|
@ -96,7 +97,14 @@ void TabMessage::closeEvent(QCloseEvent *event)
|
|||
|
||||
void TabMessage::sendMessage()
|
||||
{
|
||||
if (sayEdit->text().isEmpty() || !userOnline) {
|
||||
if (sayEdit->text().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!userOnline) {
|
||||
// Keep the draft: the user may be back momentarily, and the typed text
|
||||
// should not be lost to a transient offline spell.
|
||||
notifyUserOffline();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -105,17 +113,27 @@ void TabMessage::sendMessage()
|
|||
cmd.set_message(sayEdit->text().toStdString());
|
||||
|
||||
PendingCommand *pend = client->prepareSessionCommand(cmd);
|
||||
pend->setExtraData(sayEdit->text());
|
||||
connect(pend, &PendingCommand::finished, this, &TabMessage::messageSent);
|
||||
client->sendCommand(pend);
|
||||
|
||||
sayEdit->clear();
|
||||
}
|
||||
|
||||
void TabMessage::messageSent(const Response &response)
|
||||
void TabMessage::messageSent(const Response &response,
|
||||
const CommandContainer & /*commandContainer*/,
|
||||
const QVariant &extraData)
|
||||
{
|
||||
if (response.response_code() == Response::RespInIgnoreList) {
|
||||
chatView->appendMessage(tr(
|
||||
"This user is ignoring you, they cannot see your messages in main chat and you cannot join their games."));
|
||||
} else if (response.response_code() == Response::RespNameNotFound) {
|
||||
// The recipient went offline before the command reached the server: restore the draft.
|
||||
userOnline = false;
|
||||
if (sayEdit->text().isEmpty()) {
|
||||
sayEdit->setText(extraData.toString());
|
||||
}
|
||||
notifyUserOffline();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -175,3 +193,8 @@ void TabMessage::processUserJoined(const ServerInfo_User &_userInfo)
|
|||
userOnline = true;
|
||||
*otherUserInfo = _userInfo;
|
||||
}
|
||||
|
||||
void TabMessage::notifyUserOffline()
|
||||
{
|
||||
chatView->appendMessage(tr("Message not sent — %1 is offline.").arg(QString::fromStdString(otherUserInfo->name())));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue