IrcUser::IrcUser(const QString &hostmask, Network *network) : SyncableObject(network), _initialized(false), _nick(nickFromMask(hostmask)), _user(userFromMask(hostmask)), _host(hostFromMask(hostmask)), _realName(), _awayMessage(), _away(false), _server(), // _idleTime(QDateTime::currentDateTime()), _ircOperator(), _lastAwayMessage(0), _whoisServiceReply(), _network(network), _codecForEncoding(0), _codecForDecoding(0) { updateObjectName(); }
void ContextMenuActionProvider::addIgnoreMenu(QMenu *menu, const QString &hostmask, const QMap<QString, bool> &ignoreMap) { QMenu *ignoreMenu = _nickIgnoreMenuAction->menu(); ignoreMenu->clear(); QString nick = nickFromMask(hostmask); QString ident = userFromMask(hostmask); QString host = hostFromMask(hostmask); QString domain = host; QRegExp domainRx = QRegExp("(\\.[^.]+\\.\\w+\\D)$"); if (domainRx.indexIn(host) != -1) domain = domainRx.cap(1); // we can't rely on who-data // if we don't have the data, we skip actions where we would need it bool haveWhoData = !ident.isEmpty() && !host.isEmpty(); // add "Add Ignore Rule" description ignoreMenu->addAction(_ignoreDescriptions.at(0)); if (haveWhoData) { QString text; text = QString("*!%1@%2").arg(ident, host); action(NickIgnoreUser)->setText(text); action(NickIgnoreUser)->setProperty("ignoreRule", text); text = QString("*!*@%1").arg(host); action(NickIgnoreHost)->setText(text); action(NickIgnoreHost)->setProperty("ignoreRule", text); text = domain.at(0) == '.' ? QString("*!%1@*%2").arg(ident, domain) : QString("*!%1@%2").arg(ident, domain); action(NickIgnoreDomain)->setText(text); action(NickIgnoreDomain)->setProperty("ignoreRule", text); if (!ignoreMap.contains(action(NickIgnoreUser)->property("ignoreRule").toString())) ignoreMenu->addAction(action(NickIgnoreUser)); if (!ignoreMap.contains(action(NickIgnoreHost)->property("ignoreRule").toString())) ignoreMenu->addAction(action(NickIgnoreHost)); // we only add that NickIgnoreDomain if it isn't the same as NickIgnoreUser // as happens with @foobar.com hostmasks and ips if (!ignoreMap.contains(action(NickIgnoreDomain)->property("ignoreRule").toString()) && action(NickIgnoreUser)->property("ignoreRule").toString() != action(NickIgnoreDomain)->property("ignoreRule").toString()) ignoreMenu->addAction(action(NickIgnoreDomain)); } action(NickIgnoreCustom)->setProperty("ignoreRule", hostmask); ignoreMenu->addAction(action(NickIgnoreCustom)); ignoreMenu->addSeparator(); if (haveWhoData) { QMap<QString, bool>::const_iterator ruleIter = ignoreMap.begin(); int counter = 0; if (!ignoreMap.isEmpty()) // add "Existing Rules" description ignoreMenu->addAction(_ignoreDescriptions.at(1)); while (ruleIter != ignoreMap.constEnd()) { if (counter < 5) { ActionType type = static_cast<ActionType>(NickIgnoreToggleEnabled0 + counter*0x100000); Action *act = action(type); act->setText(ruleIter.key()); act->setProperty("ignoreRule", ruleIter.key()); act->setChecked(ruleIter.value()); ignoreMenu->addAction(act); } counter++; ++ruleIter; } if (counter) ignoreMenu->addSeparator(); } ignoreMenu->addAction(action(ShowIgnoreList)); addAction(_nickIgnoreMenuAction, menu); }
void UiStyle::StyledMessage::style() const { QString user = userFromMask(sender()); QString host = hostFromMask(sender()); QString nick = nickFromMask(sender()); QString txt = UiStyle::mircToInternal(contents()); QString bufferName = bufferInfo().bufferName(); bufferName.replace('%', "%%"); // well, you _can_ have a % in a buffername apparently... -_- host.replace('%', "%%"); // hostnames too... user.replace('%', "%%"); // and the username... nick.replace('%', "%%"); // ... and then there's totally RFC-violating servers like justin.tv m( const int maxNetsplitNicks = 15; QString t; switch (type()) { case Message::Plain: //: Plain Message t = tr("%1").arg(txt); break; case Message::Notice: //: Notice Message t = tr("%1").arg(txt); break; case Message::Action: //: Action Message t = tr("%DN%1%DN %2").arg(nick).arg(txt); break; case Message::Nick: //: Nick Message if (nick == contents()) t = tr("You are now known as %DN%1%DN").arg(txt); else t = tr("%DN%1%DN is now known as %DN%2%DN").arg(nick, txt); break; case Message::Mode: //: Mode Message if (nick.isEmpty()) t = tr("User mode: %DM%1%DM").arg(txt); else t = tr("Mode %DM%1%DM by %DN%2%DN").arg(txt, nick); break; case Message::Join: //: Join Message t = tr("%DN%1%DN %DH(%2@%3)%DH has joined %DC%4%DC").arg(nick, user, host, bufferName); break; case Message::Part: //: Part Message t = tr("%DN%1%DN %DH(%2@%3)%DH has left %DC%4%DC").arg(nick, user, host, bufferName); if (!txt.isEmpty()) t = QString("%1 (%2)").arg(t).arg(txt); break; case Message::Quit: //: Quit Message t = tr("%DN%1%DN %DH(%2@%3)%DH has quit").arg(nick, user, host); if (!txt.isEmpty()) t = QString("%1 (%2)").arg(t).arg(txt); break; case Message::Kick: { QString victim = txt.section(" ", 0, 0); QString kickmsg = txt.section(" ", 1); //: Kick Message t = tr("%DN%1%DN has kicked %DN%2%DN from %DC%3%DC").arg(nick).arg(victim).arg(bufferName); if (!kickmsg.isEmpty()) t = QString("%1 (%2)").arg(t).arg(kickmsg); } break; //case Message::Kill: FIXME case Message::Server: //: Server Message t = tr("%1").arg(txt); break; case Message::Info: //: Info Message t = tr("%1").arg(txt); break; case Message::Error: //: Error Message t = tr("%1").arg(txt); break; case Message::DayChange: { //: Day Change Message t = tr("{Day changed to %1}").arg(timestamp().date().toString(Qt::DefaultLocaleLongDate)); } break; case Message::Topic: //: Topic Message t = tr("%1").arg(txt); break; case Message::NetsplitJoin: { QStringList users = txt.split("#:#"); QStringList servers = users.takeLast().split(" "); for (int i = 0; i < users.count() && i < maxNetsplitNicks; i++) users[i] = nickFromMask(users.at(i)); t = tr("Netsplit between %DH%1%DH and %DH%2%DH ended. Users joined: ").arg(servers.at(0), servers.at(1)); if (users.count() <= maxNetsplitNicks) t.append(QString("%DN%1%DN").arg(users.join(", "))); else t.append(tr("%DN%1%DN (%2 more)").arg(static_cast<QStringList>(users.mid(0, maxNetsplitNicks)).join(", ")).arg(users.count() - maxNetsplitNicks)); } break; case Message::NetsplitQuit: { QStringList users = txt.split("#:#"); QStringList servers = users.takeLast().split(" "); for (int i = 0; i < users.count() && i < maxNetsplitNicks; i++) users[i] = nickFromMask(users.at(i)); t = tr("Netsplit between %DH%1%DH and %DH%2%DH. Users quit: ").arg(servers.at(0), servers.at(1)); if (users.count() <= maxNetsplitNicks) t.append(QString("%DN%1%DN").arg(users.join(", "))); else t.append(tr("%DN%1%DN (%2 more)").arg(static_cast<QStringList>(users.mid(0, maxNetsplitNicks)).join(", ")).arg(users.count() - maxNetsplitNicks)); } break; case Message::Invite: //: Invite Message t = tr("%1").arg(txt); break; default: t = tr("[%1]").arg(txt); } _contents = UiStyle::styleString(t, UiStyle::formatType(type())); }