Merge pull request #1194 from ZeldaZach/fix_1192

Fix local mention crash
This commit is contained in:
Zach 2015-07-03 18:41:48 -04:00
commit 360498c83f
3 changed files with 52 additions and 39 deletions

View file

@ -298,59 +298,68 @@ void ChatView::appendMessage(QString message, QString sender, UserLevelFlags use
} }
else if (index == mentionFirstIndex) else if (index == mentionFirstIndex)
{ {
QMap<QString, UserListTWI *> userList = tabSupervisor->getUserListsTab()->getAllUsersList()->getUsers(); if (tabSupervisor->getIsLocalGame())
int firstSpace = message.indexOf(" ");
QString fullMentionUpToSpaceOrEnd = (firstSpace == -1) ? message.mid(1) : message.mid(1, firstSpace - 1);
QString mentionIntact = fullMentionUpToSpaceOrEnd;
while (fullMentionUpToSpaceOrEnd.size())
{ {
if (isFullMentionAValidUser(userList, fullMentionUpToSpaceOrEnd)) // Is there a user online named this? cursor.insertText("@");
message = message.mid(1);
}
else
{
QMap<QString, UserListTWI *> userList = tabSupervisor->getUserListsTab()->getAllUsersList()->getUsers();
int firstSpace = message.indexOf(" ");
QString fullMentionUpToSpaceOrEnd = (firstSpace == -1) ? message.mid(1) : message.mid(1, firstSpace - 1);
QString mentionIntact = fullMentionUpToSpaceOrEnd;
while (fullMentionUpToSpaceOrEnd.size())
{ {
if (userName.toLower() == fullMentionUpToSpaceOrEnd.toLower()) // Is this user you? if (isFullMentionAValidUser(userList, fullMentionUpToSpaceOrEnd)) // Is there a user online named this?
{ {
// You have received a valid mention!! if (userName.toLower() == fullMentionUpToSpaceOrEnd.toLower()) // Is this user you?
mentionFormat.setBackground(QBrush(getCustomMentionColor()));
mentionFormat.setForeground(settingsCache->getChatMentionForeground() ? QBrush(Qt::white) : QBrush(Qt::black));
cursor.insertText(mention, mentionFormat);
message = message.mid(mention.size());
QApplication::alert(this);
if (settingsCache->getShowMentionPopup() && shouldShowSystemPopup())
{ {
QString ref = sender.left(sender.length() - 2); // You have received a valid mention!!
showSystemPopup(ref); mentionFormat.setBackground(QBrush(getCustomMentionColor()));
mentionFormat.setForeground(settingsCache->getChatMentionForeground() ? QBrush(Qt::white) : QBrush(Qt::black));
cursor.insertText(mention, mentionFormat);
message = message.mid(mention.size());
QApplication::alert(this);
if (settingsCache->getShowMentionPopup() && shouldShowSystemPopup())
{
QString ref = sender.left(sender.length() - 2);
showSystemPopup(ref);
}
} }
else
{
QString correctUserName = getNameFromUserList(userList, fullMentionUpToSpaceOrEnd);
UserListTWI *vlu = userList.value(correctUserName);
mentionFormatOtherUser.setAnchorHref("user://" + QString::number(vlu->getUserInfo().user_level()) + "_" + correctUserName);
cursor.insertText("@" + correctUserName, mentionFormatOtherUser);
message = message.mid(correctUserName.size() + 1);
}
cursor.setCharFormat(defaultFormat);
break;
}
else if (fullMentionUpToSpaceOrEnd.right(1).indexOf(notALetterOrNumber) == -1)
{
cursor.insertText("@" + mentionIntact, defaultFormat);
message = message.mid(mentionIntact.size() + 1);
cursor.setCharFormat(defaultFormat);
break;
} }
else else
{ {
QString correctUserName = getNameFromUserList(userList, fullMentionUpToSpaceOrEnd); fullMentionUpToSpaceOrEnd = fullMentionUpToSpaceOrEnd.left(fullMentionUpToSpaceOrEnd.size() - 1);
UserListTWI *vlu = userList.value(correctUserName);
mentionFormatOtherUser.setAnchorHref("user://" + QString::number(vlu->getUserInfo().user_level()) + "_" + correctUserName);
cursor.insertText("@" + correctUserName, mentionFormatOtherUser);
message = message.mid(correctUserName.size() + 1);
} }
cursor.setCharFormat(defaultFormat);
break;
}
else if (fullMentionUpToSpaceOrEnd.right(1).indexOf(notALetterOrNumber) == -1)
{
cursor.insertText("@" + mentionIntact, defaultFormat);
message = message.mid(mentionIntact.size() + 1);
cursor.setCharFormat(defaultFormat);
break;
}
else
{
fullMentionUpToSpaceOrEnd = fullMentionUpToSpaceOrEnd.left(fullMentionUpToSpaceOrEnd.size() - 1);
} }
} }
} }
else else
{ {
message = message.mid(1); // Not certain when this would ever be reached, but just incase message = message.mid(1); // Not certain when this would ever be reached, but just incase lets skip the character
} }
} }

View file

@ -184,6 +184,7 @@ int TabSupervisor::myAddTab(Tab *tab)
void TabSupervisor::start(const ServerInfo_User &_userInfo) void TabSupervisor::start(const ServerInfo_User &_userInfo)
{ {
isLocalGame = false;
userInfo = new ServerInfo_User(_userInfo); userInfo = new ServerInfo_User(_userInfo);
tabServer = new TabServer(this, client); tabServer = new TabServer(this, client);
@ -227,6 +228,7 @@ void TabSupervisor::startLocal(const QList<AbstractClient *> &_clients)
tabDeckStorage = 0; tabDeckStorage = 0;
tabReplays = 0; tabReplays = 0;
tabAdmin = 0; tabAdmin = 0;
isLocalGame = true;
userInfo = new ServerInfo_User; userInfo = new ServerInfo_User;
localClients = _clients; localClients = _clients;
for (int i = 0; i < localClients.size(); ++i) for (int i = 0; i < localClients.size(); ++i)

View file

@ -60,6 +60,7 @@ private:
void addCloseButtonToTab(Tab *tab, int tabIndex); void addCloseButtonToTab(Tab *tab, int tabIndex);
QString sanitizeTabName(QString dirty) const; QString sanitizeTabName(QString dirty) const;
QString sanitizeHtml(QString dirty) const; QString sanitizeHtml(QString dirty) const;
bool isLocalGame;
public: public:
TabSupervisor(AbstractClient *_client, QWidget *parent = 0); TabSupervisor(AbstractClient *_client, QWidget *parent = 0);
~TabSupervisor(); ~TabSupervisor();
@ -67,6 +68,7 @@ public:
void start(const ServerInfo_User &userInfo); void start(const ServerInfo_User &userInfo);
void startLocal(const QList<AbstractClient *> &_clients); void startLocal(const QList<AbstractClient *> &_clients);
void stop(); void stop();
bool getIsLocalGame() const { return isLocalGame; }
int getGameCount() const { return gameTabs.size(); } int getGameCount() const { return gameTabs.size(); }
TabUserLists *getUserListsTab() const { return tabUserLists; } TabUserLists *getUserListsTab() const { return tabUserLists; }
ServerInfo_User *getUserInfo() const { return userInfo; } ServerInfo_User *getUserInfo() const { return userInfo; }