Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "channeltab.h"
- #include "channelview.h"
- #include "chatinput.h"
- #include "chatview.h"
- #include "dialogs/messagelog.h"
- #include "identityconfig.h"
- #include "nickview.h"
- #include "settings.h"
- #include <Aki/Irc/Channel>
- #include <Aki/Irc/Color>
- #include <Aki/Irc/Rfc2812>
- #include <Aki/Irc/Socket>
- #include <Aki/Irc/User>
- #include <KAction>
- #include <KComboBox>
- #include <KDebug>
- #include <KLineEdit>
- #include <KLocale>
- #include <KMenu>
- #include <QGridLayout>
- #include <QListView>
- #include <QSplitter>
- #include <QTimer>
- #include "nicklistmodel.h"
- class ChannelTabPrivate
- {
- public:
- QGridLayout *mainLayout;
- QSplitter *mainSplitter;
- NickView *userList;
- ChatView *channelOutput;
- KComboBox *nickSelector;
- ChatInput *channelInput;
- KLineEdit *topic;
- QTimer *whoTimer;
- Aki::Irc::Channel *channel;
- Aki::Irc::Socket *socket;
- IdentityConfig *config;
- ChannelView *view;
- QStringList autoRequest;
- bool isCurrent;
- bool whoWaiting;
- }; // End of class ChannelTabPrivate.
- ChannelTab::ChannelTab(const QString &name, IdentityConfig *identity, Aki::Irc::Socket *socket, QWidget *parent)
- : Aki::ChannelInterface(parent),
- d(new ChannelTabPrivate)
- {
- qsrand(std::time(0));
- d->socket = socket;
- d->config = identity;
- setName(name);
- setSocket(socket);
- d->mainLayout = new QGridLayout(this);
- d->mainSplitter = new QSplitter(this);
- d->mainSplitter->setOrientation(Qt::Horizontal);
- d->mainSplitter->setChildrenCollapsible(false);
- d->channelOutput = new ChatView(d->mainSplitter);
- d->channelOutput->setNotifyClick(false);
- QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- sizePolicy.setHorizontalStretch(1);
- sizePolicy.setVerticalStretch(0);
- sizePolicy.setHeightForWidth(d->channelOutput->sizePolicy().hasHeightForWidth());
- d->channelOutput->setSizePolicy(sizePolicy);
- d->topic = new KLineEdit(this);
- d->mainSplitter->addWidget(d->channelOutput);
- d->userList = new NickView(d->mainSplitter);
- d->userList->setContextMenuPolicy(Qt::CustomContextMenu);
- d->userList->setFocusPolicy(Qt::NoFocus);
- connect(d->userList, SIGNAL(customContextMenuRequested(QPoint)),
- this, SLOT(slotCustomContextMenuRequested(QPoint)));
- d->mainSplitter->addWidget(d->userList);
- d->mainLayout->addWidget(d->topic, 0, 0, 1, 2);
- d->mainLayout->addWidget(d->mainSplitter, 1, 0, 1, 2);
- d->nickSelector = new KComboBox(false, this);
- d->nickSelector->setEditable(false);
- d->nickSelector->setDuplicatesEnabled(false);
- d->mainLayout->addWidget(d->nickSelector, 2, 0, 1, 1);
- d->channelInput = new ChatInput(this);
- d->mainLayout->addWidget(d->channelInput, 2, 1, 1, 1);
- d->channel = new Aki::Irc::Channel(name, this);
- setLayout(d->mainLayout);
- d->whoWaiting = false;
- d->view = qobject_cast<ChannelView*>(parent);
- QWidget::setTabOrder(d->topic, d->channelOutput);
- QWidget::setTabOrder(d->channelOutput, d->nickSelector);
- QWidget::setTabOrder(d->nickSelector, d->channelInput);
- QWidget::setTabOrder(d->channelInput, d->userList);
- QWidget::setTabOrder(d->userList, d->topic);
- connect(d->socket, SIGNAL(onTopic(QString,QString)),
- this, SLOT(slotOnTopic(QString,QString)));
- connect(d->socket, SIGNAL(onPrivmsg(QString,QString,QString,QString)),
- this, SLOT(slotOnPrivmsg(QString,QString,QString,QString)));
- connect(d->socket, SIGNAL(onUserJoin(QString,QString)),
- this, SLOT(slotOnUserJoin(QString,QString)));
- connect(d->socket, SIGNAL(onUserPart(QString,QString,QString)),
- this, SLOT(slotOnUserPart(QString,QString,QString)));
- connect(d->socket, SIGNAL(onNoticeAuth(QString)),
- this, SLOT(slotOnNoticeAuth(QString)));
- connect(d->socket, SIGNAL(onNotice(QString)),
- this, SLOT(slotOnNotice(QString)));
- connect(d->socket, SIGNAL(onNotice(QString,QString)),
- this, SLOT(slotOnNotice(QString,QString)));
- connect(d->socket, SIGNAL(onNameReply(QString,QString)),
- this, SLOT(slotOnNameReply(QString,QString)));
- connect(d->socket, SIGNAL(onCreated(QString)),
- this, SLOT(slotOnWelcome(QString)));
- connect(d->socket, SIGNAL(onYourHost(QString)),
- this, SLOT(slotOnWelcome(QString)));
- connect(d->socket, SIGNAL(onWelcome(QString)),
- this, SLOT(slotOnWelcome(QString)));
- connect(d->socket, SIGNAL(onMyInfo(QString)),
- this, SLOT(slotOnWelcome(QString)));
- connect(d->socket, SIGNAL(onBounce(QString)),
- this, SLOT(slotOnSupport(QString)));
- connect(d->socket, SIGNAL(onMotd(QString)),
- this, SLOT(slotOnMotd(QString)));
- connect(d->socket, SIGNAL(onWho(QString,QString,QString,QString,QString,QString,int,QString)),
- this, SLOT(slotOnWho(QString,QString,QString,QString,QString,QString,int,QString)));
- connect(d->socket, SIGNAL(onNick(QString,QString)),
- this, SLOT(slotOnNick(QString,QString)));
- connect(d->socket, SIGNAL(onKick(QString,QString,QString)),
- this, SLOT(slotOnKick(QString,QString,QString)));
- connect(d->socket, SIGNAL(onMode(QString,QString,QString,QString)),
- this, SLOT(slotOnMode(QString,QString,QString,QString)));
- connect(d->socket, SIGNAL(onUserQuit(QString,QString)),
- this, SLOT(slotOnUserQuit(QString,QString)));
- connect(d->nickSelector, SIGNAL(activated(QString)),
- this, SLOT(slotNickIndexChanged(QString)));
- connect(d->channelInput, SIGNAL(textSubmitted()),
- this, SLOT(slotTextSubmitted()));
- connect(d->socket, SIGNAL(onCtcpAction(QString,QString,QString)),
- this, SLOT(slotOnCtcpAction(QString,QString,QString)));
- connect(d->socket, SIGNAL(onNoticeCtcpVersion(QString,QString)),
- this, SLOT(slotOnNoticeCtcpVersion(QString,QString)));
- connect(d->socket, SIGNAL(onNicknameInUseError(QString,QString)),
- this, SLOT(slotOnNicknameInUseError(QString,QString)));
- connect(d->socket, SIGNAL(onTopicSetBy(QString,QString,QString)),
- this, SLOT(slotOnTopicSetBy(QString,QString,QString)));
- connect(d->socket, SIGNAL(onChannelCreated(QString,QString)),
- this, SLOT(slotOnChannelCreated(QString,QString)));
- connect(d->socket, SIGNAL(onRawMessage(QString)),
- this, SLOT(slotOnRawMessage(QString)));
- connect(d->channelInput, SIGNAL(showCompletion()),
- this, SLOT(slotShowCompletion()));
- connect(d->socket, SIGNAL(onChannelPrivilegesNeededError(QString,QString)),
- this, SLOT(slotOnChannelPrivilegesNeededError(QString,QString)));
- connect(d->socket, SIGNAL(onModeUnknownFlagError(QString)),
- this, SLOT(slotOnModeUnknownFlagError(QString)));
- connect(d->socket, SIGNAL(onUsersDontMatchError(QString)),
- this, SLOT(slotOnUsersDontMatchError(QString)));
- connect(d->socket, SIGNAL(onEndOfWho(QString,QString)),
- this, SLOT(slotOnEndOfWho(QString,QString)));
- if (name != d->socket->name()) {
- d->whoTimer = new QTimer(this);
- d->whoTimer->start(90000);
- connect(d->whoTimer, SIGNAL(timeout()), this, SLOT(slotPerformWho()));
- d->socket->rfcMode(name);
- d->socket->rfcWho(name);
- } else {
- QTimer::singleShot(10000, this, SLOT(slotPerformJoin()));
- setHideNickList(true);
- d->topic->setHidden(true);
- }
- }
- ChannelTab::~ChannelTab()
- {
- delete d;
- }
- void
- ChannelTab::addNick(const QString &nick)
- {
- if (!d->nickSelector->contains(nick)) {
- d->nickSelector->insertItem(d->nickSelector->count(), nick);
- emit nickAdded(nick);
- }
- }
- ChatView*
- ChannelTab::channelOutput()
- {
- return d->channelOutput;
- }
- void
- ChannelTab::clearNickList()
- {
- foreach (Aki::Irc::User *user, d->userList->users()) {
- d->userList->removeItem(user);
- }
- }
- bool
- ChannelTab::isNickListHidden() const
- {
- return d->userList->isHidden();
- }
- void
- ChannelTab::setCurrent(bool current)
- {
- ChannelInterface::setCurrent(current);
- if (isCurrent()) {
- d->channelInput->setFocus();
- }
- }
- void
- ChannelTab::setNickList(const QStringList &nicks)
- {
- d->nickSelector->clear();
- d->nickSelector->addItems(nicks);
- d->nickSelector->setCurrentIndex(d->nickSelector->findText(d->socket->currentNick()));
- }
- void
- ChannelTab::setHideNickList(bool hide)
- {
- d->userList->setHidden(hide);
- }
- void
- ChannelTab::setTabColor(ChannelTab::TabColor color)
- {
- const int currentIndex = view()->indexOf(this);
- const QColor currentColour = view()->tabTextColor(currentIndex);
- if (color == ChannelTab::Default) {
- view()->setTabTextColor(currentIndex, Aki::Settings::defaultTabColor());
- } else if (color == ChannelTab::Highlight) {
- view()->setTabTextColor(currentIndex, Aki::Settings::highlightTabColor());
- } else if (color == ChannelTab::NewData) {
- if (currentColour != Aki::Settings::newMessageTabColor() ||
- currentColour != Aki::Settings::highlightTabColor()) {
- view()->setTabTextColor(currentIndex, Aki::Settings::newDataTabColor());
- }
- } else if (color == ChannelTab::NewMessage) {
- if (currentColour != Aki::Settings::highlightTabColor()) {
- view()->setTabTextColor(currentIndex, Aki::Settings::newMessageTabColor());
- }
- }
- }
- void
- ChannelTab::slotBanNicknameTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- d->socket->rfcMode(name(), QString("+b *!%1@%2").arg(user->user(), user->host()));
- }
- void
- ChannelTab::slotCustomContextMenuRequested(const QPoint &pos)
- {
- Q_UNUSED(pos);
- KMenu *ctx = new KMenu(this);
- KMenu *modesMenu = new KMenu(i18n("Modes"), ctx);
- KMenu *kickBanMenu = new KMenu(i18n("Kick / Ban"), ctx);
- KAction *giveOpAction = new KAction(modesMenu);
- giveOpAction->setText(i18n("Give Ops"));
- giveOpAction->setIcon(KIcon("irc-operator"));
- connect(giveOpAction, SIGNAL(triggered(bool)),
- this, SLOT(slotGiveOpTriggered()));
- KAction *takeOpAction = new KAction(modesMenu);
- takeOpAction->setText(i18n("Take Ops"));
- takeOpAction->setIcon(KIcon("irc-remove-operator"));
- connect(takeOpAction, SIGNAL(triggered(bool)),
- this, SLOT(slotTakeOpTriggered()));
- KAction *giveHalfOpAction = new KAction(modesMenu);
- giveHalfOpAction->setText(i18n("Give Half-Ops"));
- connect(giveHalfOpAction, SIGNAL(triggered(bool)),
- this, SLOT(slotGiveHalfOpTriggered()));
- KAction *takeHalfOpAction = new KAction(modesMenu);
- takeHalfOpAction->setText(i18n("Take Half-Ops"));
- connect(takeHalfOpAction, SIGNAL(triggered(bool)),
- this, SLOT(slotTakeHalfOpTriggered()));
- KAction *giveVoiceAction = new KAction(modesMenu);
- giveVoiceAction->setText(i18n("Give Voice"));
- giveVoiceAction->setIcon(KIcon("irc-voice"));
- connect(giveVoiceAction, SIGNAL(triggered(bool)),
- this, SLOT(slotGiveVoiceTriggered()));
- KAction *takeVoiceAction = new KAction(modesMenu);
- takeVoiceAction->setText(i18n("Take Voice"));
- takeVoiceAction->setIcon(KIcon("irc-unvoice"));
- connect(takeVoiceAction, SIGNAL(triggered(bool)),
- this, SLOT(slotTakeVoiceTriggered()));
- modesMenu->addAction(giveOpAction);
- modesMenu->addAction(takeOpAction);
- modesMenu->addSeparator();
- modesMenu->addAction(giveHalfOpAction);
- modesMenu->addAction(takeHalfOpAction);
- modesMenu->addSeparator();
- modesMenu->addAction(giveVoiceAction);
- modesMenu->addAction(takeVoiceAction);
- KAction *kickUserAction = new KAction(kickBanMenu);
- kickUserAction->setText(i18n("Kick"));
- connect(kickUserAction, SIGNAL(triggered(bool)),
- this, SLOT(slotKickUserTriggered()));
- KAction *banNicknameAction = new KAction(kickBanMenu);
- banNicknameAction->setText(i18n("Ban"));
- connect(banNicknameAction, SIGNAL(triggered(bool)),
- this, SLOT(slotBanNicknameTriggered()));
- KAction *kickBanUserAction = new KAction(kickBanMenu);
- kickBanUserAction->setText(i18n("KickBan"));
- KAction *banHostAction = new KAction(kickBanMenu);
- banHostAction->setText(i18n("Ban *!*@!.host"));
- KAction *banDomainAction = new KAction(kickBanMenu);
- banDomainAction->setText(i18n("Ban *!*@domain"));
- KAction *banUserHostAction = new KAction(kickBanMenu);
- banUserHostAction->setText(i18n("Ban *!user@*.host"));
- KAction *banUserDomainAction = new KAction(kickBanMenu);
- banUserDomainAction->setText(i18n("Ban *!user@domain"));
- KAction *kickBanHostAction = new KAction(kickBanMenu);
- kickBanHostAction->setText(i18n("KickBan *!*@*.host"));
- KAction *kickBanDomainAction = new KAction(kickBanMenu);
- kickBanDomainAction->setText(i18n("KickBan *!*@domain"));
- KAction *kickBanUserHostAction = new KAction(kickBanMenu);
- kickBanUserHostAction->setText(i18n("KickBan *!user@*.host"));
- KAction *kickBanUserDomainAction = new KAction(kickBanMenu);
- kickBanUserDomainAction->setText(i18n("KickBan *!user@domain"));
- kickBanMenu->addAction(kickUserAction);
- kickBanMenu->addAction(banNicknameAction);
- kickBanMenu->addAction(kickBanUserAction);
- kickBanMenu->addSeparator();
- kickBanMenu->addAction(banHostAction);
- kickBanMenu->addAction(banDomainAction);
- kickBanMenu->addAction(banUserHostAction);
- kickBanMenu->addAction(banUserDomainAction);
- kickBanMenu->addSeparator();
- kickBanMenu->addAction(kickBanHostAction);
- kickBanMenu->addAction(kickBanDomainAction);
- kickBanMenu->addAction(kickBanUserHostAction);
- kickBanMenu->addAction(kickBanUserDomainAction);
- QModelIndex current = d->userList->currentIndex();
- if (current.isValid()) {
- ctx->addMenu(modesMenu);
- ctx->addMenu(kickBanMenu);
- ctx->exec(QCursor::pos());
- }
- }
- void
- ChannelTab::slotGiveHalfOpTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- d->socket->rfcMode(name(), QString("+h %1").arg(user->nick()));
- }
- void
- ChannelTab::slotGiveOpTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- d->socket->rfcMode(name(), QString("+o %1").arg(user->nick()));
- }
- void
- ChannelTab::slotGiveVoiceTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- d->socket->rfcMode(name(), QString("+v %1").arg(user->nick()));
- }
- void
- ChannelTab::slotKickUserTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- if (d->config->kickMessage().isEmpty()) {
- d->socket->rfcKick(name(), user->nick());
- } else {
- d->socket->rfcKick(name(), user->nick(), d->config->kickMessage());
- }
- }
- void
- ChannelTab::slotNickIndexChanged(const QString &nick)
- {
- d->socket->rfcNick(nick.trimmed());
- d->channelInput->setFocus();
- }
- void
- ChannelTab::slotOnChannelCreated(const QString &channel, const QString &time)
- {
- if (channel.toLower() == name()) {
- d->channelOutput->addChannelCreated(time);
- }
- }
- void
- ChannelTab::slotOnChannelPrivilegesNeededError(const QString &channel, const QString &errorMessage)
- {
- if (channel.toLower() == name().toLower()) {
- d->channelOutput->addError(channel, errorMessage);
- }
- }
- void
- ChannelTab::slotOnCtcpAction(const QString &from, const QString &to, const QString &message)
- {
- if (name() == to) {
- d->channelOutput->addCtcpAction(from, message);
- if (!isCurrent()) {
- setTabColor(ChannelTab::NewData);
- }
- }
- }
- void
- ChannelTab::slotOnEndOfWho(const QString &channel, const QString &message)
- {
- if (d->autoRequest.contains("WHO")) {
- d->channelOutput->addWho(channel, message);
- d->autoRequest.removeAt(d->autoRequest.indexOf("WHO"));
- return;
- }
- if (channel.toLower() == name().toLower()) {
- d->whoTimer->stop();
- d->whoTimer->start(90000);
- }
- }
- void
- ChannelTab::slotOnKick(const QString &channel, const QString &nick, const QString &message)
- {
- Q_UNUSED(message);
- if (name() == channel) {
- foreach (Aki::Irc::User *user, d->userList->users()) {
- if (user->nick() == nick) {
- d->userList->removeItem(user);
- }
- }
- if (!isCurrent()) {
- if (nick == d->socket->currentNick()) {
- setTabColor(ChannelTab::Highlight);
- } else {
- setTabColor(ChannelTab::NewData);
- }
- }
- }
- }
- void
- ChannelTab::slotOnMode(const QString &from, const QString &channel, const QString &mode, const QString &nick)
- {
- if (name().toLower() != channel.toLower()) {
- return;
- }
- enum {
- None,
- Give,
- Take
- };
- int state = None;
- QModelIndex index;
- Aki::Irc::User *user = 0;
- for (int i = 0; i < d->userList->count(); ++i) {
- index = d->userList->model()->index(i, 0);
- user = d->userList->model()->data(index, NickListModel::IrcUserRole).value<Aki::Irc::User*>();
- if (user->nick() == nick) {
- break;
- }
- }
- if (!user) {
- return;
- }
- QString modes = user->modes();
- bool fromYou = (from == d->nickSelector->currentText());
- bool toYou = (nick == d->nickSelector->currentText());
- foreach (QChar c, mode) {
- if (c == QChar('+')) {
- state = Give;
- } else if (c == QChar('-')) {
- state = Take;
- } else if (c == QChar('o')) {
- if (state == Give) {
- user->setModes(modes + c);
- d->userList->model()->setData(index,
- QVariant::fromValue<Aki::Irc::User*>(user),
- NickListModel::IrcUserRole);
- d->channelOutput->addMode(from, nick, c, toYou, fromYou);
- } else if (state == Take) {
- user->removeModes(c);
- d->userList->model()->setData(index,
- QVariant::fromValue<Aki::Irc::User*>(user),
- NickListModel::IrcUserRole);
- d->channelOutput->addRemoveMode(from, nick, c, toYou, fromYou);
- }
- } else if (c == QChar('v')) {
- if (state == Give) {
- user->setModes(modes + c);
- d->userList->model()->setData(index,
- QVariant::fromValue<Aki::Irc::User*>(user),
- NickListModel::IrcUserRole);
- d->channelOutput->addMode(from, nick, c, toYou, fromYou);
- } else if (state == Take) {
- user->removeModes(c);
- d->userList->model()->setData(index,
- QVariant::fromValue<Aki::Irc::User*>(user),
- NickListModel::IrcUserRole);
- d->channelOutput->addRemoveMode(from, nick, c, toYou, fromYou);
- }
- } else if (c == QChar('h')) {
- if (state == Give) {
- user->setModes(modes + c);
- d->userList->model()->setData(index,
- QVariant::fromValue<Aki::Irc::User*>(user),
- NickListModel::IrcUserRole);
- d->channelOutput->addMode(from, nick, c, toYou, fromYou);
- } else if (state == Take) {
- user->removeModes(c);
- d->userList->model()->setData(index,
- QVariant::fromValue<Aki::Irc::User*>(user),
- NickListModel::IrcUserRole);
- d->channelOutput->addRemoveMode(from, nick, c, toYou, fromYou);
- }
- }
- }
- d->userList->update(index);
- if (!isCurrent()) {
- setTabColor(ChannelTab::NewData);
- }
- }
- void
- ChannelTab::slotOnModeUnknownFlagError(const QString &errorMessage)
- {
- if (isCurrent()) {
- d->channelOutput->addError(errorMessage);
- }
- }
- void
- ChannelTab::slotOnMotd(const QString &message)
- {
- if (name().toLower() == d->socket->name().toLower()) {
- d->channelOutput->addMotd(Aki::Irc::Color::toHtml(message));
- }
- }
- void
- ChannelTab::slotOnNameReply(const QString &channel, const QString &names)
- {
- if (name().toLower() == channel.toLower()) {
- QStringList tmp = names.split(QChar(' '), QString::SkipEmptyParts);
- QStringListIterator namesIter(tmp);
- while (namesIter.hasNext()) {
- QString name = namesIter.next();
- Aki::Irc::User *user = new Aki::Irc::User("", this);
- switch (qrand() % 7) {
- case 0:
- user->setColor(Aki::Settings::userColor0());
- break;
- case 1:
- user->setColor(Aki::Settings::userColor1());
- break;
- case 2:
- user->setColor(Aki::Settings::userColor2());
- break;
- case 3:
- user->setColor(Aki::Settings::userColor3());
- break;
- case 4:
- user->setColor(Aki::Settings::userColor4());
- break;
- case 5:
- user->setColor(Aki::Settings::userColor5());
- break;
- case 6:
- user->setColor(Aki::Settings::userColor6());
- break;
- default:
- break;
- }
- if (name.left(1) == QChar('@')) {
- user->setNick(name.remove(QChar('@')));
- user->setModes("+o");
- d->userList->addItem(user);
- } else if (name.left(1) == QChar('+')) {
- user->setNick(name.remove(QChar('+')));
- user->setModes("+v");
- d->userList->addItem(user);
- } else {
- user->setNick(name);
- d->userList->addItem(user);
- }
- }
- }
- }
- void
- ChannelTab::slotOnNick(const QString &oldNick, const QString &newNick)
- {
- foreach (Aki::Irc::User *user, d->userList->users()) {
- if (user->nick() == oldNick) {
- if (oldNick == d->socket->currentNick() ||
- newNick == d->socket->currentNick()) {
- d->socket->appendNick(newNick);
- d->socket->setCurrentNick(newNick);
- if (!d->nickSelector->contains(newNick)) {
- d->nickSelector->addItem(newNick);
- }
- int index = d->nickSelector->findText(newNick, Qt::MatchExactly);
- d->nickSelector->setCurrentIndex(index);
- }
- int index = d->userList->users().indexOf(user);
- user->setNick(newNick);
- d->userList->users().replace(index, user);
- d->channelOutput->addNick(oldNick, newNick);
- return;
- }
- }
- if (name() == d->socket->name() &&
- (oldNick == d->socket->currentNick() ||
- newNick == d->socket->currentNick())) {
- if (!d->nickSelector->contains(newNick)) {
- d->nickSelector->addItem(newNick);
- }
- int index = d->nickSelector->findText(newNick, Qt::MatchExactly);
- d->nickSelector->setCurrentIndex(index);
- d->channelOutput->addNick(oldNick, newNick);
- }
- }
- void
- ChannelTab::slotOnNicknameInUseError(const QString &attemptedNickname, const QString &errorMessage)
- {
- const int currentIndex = d->nickSelector->currentIndex();
- const int count = d->nickSelector->count();
- if (currentIndex == (count - 1)) {
- return;
- }
- d->nickSelector->setCurrentIndex(currentIndex + 1);
- const QString currentNick = d->nickSelector->currentText();
- d->socket->setCurrentNick(currentNick);
- d->socket->rfcNick(currentNick);
- if (isCurrent()) {
- d->channelOutput->append(QString("<span style='color: %1;'>** %2 :%3</span>")
- .arg(Aki::Settings::errorColor().name(), attemptedNickname, errorMessage));
- }
- }
- void
- ChannelTab::slotOnNotice(const QString &message)
- {
- if (name().toLower() == d->socket->name().toLower()) {
- d->channelOutput->addNotice(Aki::Irc::Color::toHtml(message));
- if (!isCurrent()) {
- setTabColor(ChannelTab::NewData);
- }
- }
- }
- void
- ChannelTab::slotOnNotice(const QString &from, const QString &message)
- {
- if (name().toLower() == d->socket->name().toLower()) {
- d->channelOutput->addNotice(from, Aki::Irc::Color::toHtml(message));
- QString nick = Aki::Irc::Rfc2812::nickFromMask(from);
- if (Aki::Irc::Rfc2812::isValidNickname(nick)) {
- if (nick == "NickServ" && message.contains("This nickname is registered", Qt::CaseInsensitive)) {
- if (d->socket->serviceName().toLower().trimmed() == "nickserv" &&
- !d->socket->servicePassword().isEmpty() && d->socket->isAutoIdentifyEnabled()) {
- d->socket->rfcPrivmsg("NickServ", QString("identify %1").arg(d->socket->servicePassword()));
- }
- } else {
- // TODO: This should be filled with other nick services. But I don't know what others there
- // are so if anyone know send patch or me a list.
- }
- }
- }
- }
- void
- ChannelTab::slotOnNoticeAuth(const QString &message)
- {
- if (name().toLower() == d->socket->name().toLower()) {
- d->channelOutput->addNoticeAuth(Aki::Irc::Color::toHtml(message));
- }
- }
- void
- ChannelTab::slotOnNoticeCtcpVersion(const QString &from, const QString &version)
- {
- if (isCurrent()) {
- d->channelOutput->addCtcp(from, Aki::Irc::Color::toHtml(version));
- }
- }
- void
- ChannelTab::slotOnPrivmsg(const QString &channel, const QString &from, const QString &to,
- const QString &message)
- {
- if (channel.toLower() == name().toLower()) {
- foreach (Aki::Irc::User *user, d->userList->users()) {
- if (user->nick() == from) {
- QString matchString = "\\s*" + d->socket->currentNick() + ":*\\s*";
- if (message.contains(QRegExp(matchString))) {
- QString colour =
- QString("<font color='%1'>%2</font>").arg(
- user->color().name(), user->nick());
- d->channelOutput->addPrivmsgHighlight(colour, Aki::Irc::Color::toHtml(message));
- if (!isCurrent()) {
- setTabColor(ChannelTab::Highlight);
- }
- } else {
- QString colour =
- QString("<font color='%1'>%2</font>").arg(
- user->color().name(), user->nick());
- d->channelOutput->addPrivmsg(colour, Aki::Irc::Color::toHtml(message));
- if (!isCurrent()) {
- setTabColor(ChannelTab::NewMessage);
- }
- }
- return;
- }
- }
- } else if(to == d->socket->currentNick()) {
- #ifdef Q_CC_GNU
- #warning "Add support for Private messaging"
- #endif
- Q_UNUSED(from);
- }
- }
- void
- ChannelTab::slotOnRawMessage(const QString &message)
- {
- if (name().toLower() == d->socket->name().toLower()) {
- MessageLog::self()->addMessage(true, QString(), message);
- }
- }
- void
- ChannelTab::slotOnSupport(const QString &message)
- {
- if (name().toLower() == d->socket->name().toLower()) {
- d->channelOutput->addSupport(Aki::Irc::Color::toHtml(message));
- }
- }
- void
- ChannelTab::slotOnTopic(const QString &channel, const QString &topic)
- {
- if (channel.toLower() == name().toLower()) {
- d->channelOutput->addTopic(Aki::Irc::Color::toHtml(topic));
- d->topic->setText(topic);
- }
- }
- void
- ChannelTab::slotOnTopicSetBy(const QString &nick, const QString &channel,
- const QString &time)
- {
- if (channel.toLower() == name()) {
- d->channelOutput->addTopicSetBy(nick, time);
- }
- }
- void
- ChannelTab::slotOnUserJoin(const QString &hostMask, const QString &channel)
- {
- if (channel.toLower() == name().toLower()) {
- QString nick = Aki::Irc::Rfc2812::nickFromMask(hostMask);
- QString user = Aki::Irc::Rfc2812::userFromMask(hostMask);
- QString host = Aki::Irc::Rfc2812::hostFromMask(hostMask);
- d->channelOutput->addUserJoin(channel, nick, user + QChar('@') + host);
- Aki::Irc::User *ircUser = new Aki::Irc::User(hostMask, this);
- d->userList->addItem(ircUser);
- }
- }
- void
- ChannelTab::slotOnUserPart(const QString &hostMask, const QString &channel,
- const QString &partMessage)
- {
- if (channel.toLower() == name().toLower()) {
- QString nick = Aki::Irc::Rfc2812::nickFromMask(hostMask);
- QString userMask = Aki::Irc::Rfc2812::userFromMask(hostMask);
- QString host = Aki::Irc::Rfc2812::hostFromMask(hostMask);
- QModelIndex index;
- Aki::Irc::User *user = 0;
- for (int i = 0; i < d->userList->count(); ++i) {
- index = d->userList->model()->index(i, 0);
- user = d->userList->model()->data(index, NickListModel::IrcUserRole).value<Aki::Irc::User*>();
- if (user->nick() == nick) {
- break;
- }
- }
- if (!user) {
- return;
- }
- d->userList->removeItem(user);
- d->channelOutput->addUserPart(channel, nick, userMask + QChar('@') + host, partMessage);
- }
- }
- void
- ChannelTab::slotOnUserQuit(const QString &hostMask, const QString &quitMessage)
- {
- QString nick = Aki::Irc::Rfc2812::nickFromMask(hostMask);
- QString userMask = Aki::Irc::Rfc2812::userFromMask(hostMask);
- QString host = Aki::Irc::Rfc2812::hostFromMask(hostMask);
- QModelIndex index;
- Aki::Irc::User *user = 0;
- for (int i = 0; i < d->userList->count(); ++i) {
- index = d->userList->model()->index(i, 0);
- user = d->userList->model()->data(index, NickListModel::IrcUserRole).value<Aki::Irc::User*>();
- if (user->nick() == nick) {
- break;
- }
- }
- if (!user) {
- return;
- }
- d->userList->removeItem(user);
- d->channelOutput->addUserQuit(nick, userMask + QChar('@') + host, quitMessage);
- }
- void
- ChannelTab::slotOnUsersDontMatchError(const QString &errorMessage)
- {
- if (isCurrent()) {
- d->channelOutput->addError(errorMessage);
- }
- }
- void
- ChannelTab::slotOnWelcome(const QString &message)
- {
- if (name().toLower() == d->socket->name().toLower()) {
- d->channelOutput->addWelcome(Aki::Irc::Color::toHtml(message));
- }
- }
- void
- ChannelTab::slotOnWho(const QString &channel, const QString &userName, const QString &address,
- const QString &server, const QString &nick, const QString &flags, int hops,
- const QString &realName)
- {
- if (d->autoRequest.contains("WHO")) {
- d->channelOutput->addWho(channel, userName, address, server, nick, flags, hops, realName);
- return;
- }
- if (d->userList->count() == 0) {
- return;
- }
- if (channel.toLower() != name().toLower()) {
- return;
- }
- d->whoWaiting = false;
- QModelIndex index;
- Aki::Irc::User *user = 0;
- QAbstractItemModel *model = d->userList->model();
- for (int i = 0; i < d->userList->count(); ++i) {
- index = model->index(i, 0);
- user = model->data(index, NickListModel::IrcUserRole).value<Aki::Irc::User*>();
- if (user->nick() == nick) {
- break;
- }
- }
- /*for (int i = 0; i < d->userList->count(); ++i) {
- index = d->userList->model()->index(i, 0);
- user = d->userList->model()->data(index, NickListModel::IrcUserRole).value<Aki::Irc::User*>();
- if (user->nick() == nick) {
- break;
- }
- }*/
- user->setUser(userName);
- user->setNick(nick);
- user->setHost(address);
- user->setRealName(realName);
- foreach (QChar c, flags) {
- if (c == QChar('@')) {
- if (!user->containsMode(QChar('o'))) {
- user->setModes(user->modes() + QChar('o'));
- }
- } else if (c == QChar('+')) {
- if (!user->containsMode(QChar('+'))) {
- user->setModes(user->modes() + QChar('v'));
- }
- } else if (c == QChar('H')) {
- user->setAway(false);
- } else if (c == QChar('G')) {
- user->setAway(true);
- } else {
- kDebug() << "Unsupported flag: " << c;
- }
- }
- model->setData(index, QVariant::fromValue<Aki::Irc::User*>(user), NickListModel::IrcUserRole);
- }
- void
- ChannelTab::slotPerformJoin()
- {
- if (d->socket->isAutoJoinChannelsEnabled()) {
- QStringList chans;
- QStringListIterator chanIter(d->socket->channelList());
- while (chanIter.hasNext()) {
- QString channel = chanIter.next();
- chans << channel;
- }
- d->socket->rfcJoin(chans);
- }
- }
- void
- ChannelTab::slotPerformWho()
- {
- if (d->whoWaiting) {
- d->whoTimer->stop();
- d->whoTimer->start(90000);
- return;
- }
- kDebug() << KDateTime::currentLocalTime() << " Who: " << name();
- d->socket->rfcWho(name());
- d->whoTimer->start(90000);
- d->whoWaiting = true;
- }
- void
- ChannelTab::slotShowCompletion()
- {
- if (d->channelInput->text().isEmpty()) {
- return;
- }
- int oldPosition;
- int position;
- QString line = d->channelInput->text();
- oldPosition = position = line.length();
- QString attemptedNick;
- while (position && line[position - 1] != ' ') {
- position--;
- }
- attemptedNick = line.mid(position, oldPosition + position);
- QStringList list;
- foreach (Aki::Irc::User *user, d->userList->users()) {
- if (attemptedNick.isEmpty() || user->nick().startsWith(attemptedNick)) {
- list << user->nick();
- }
- }
- qSort(list);
- d->channelInput->setNickCompletionList(list);
- }
- void
- ChannelTab::slotTakeHalfOpTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- d->socket->rfcMode(name(), QString("-h %1").arg(user->nick()));
- }
- void
- ChannelTab::slotTakeOpTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- d->socket->rfcMode(name(), QString("-o %1").arg(user->nick()));
- }
- void
- ChannelTab::slotTakeVoiceTriggered()
- {
- NickListModel *model = static_cast<NickListModel*>(d->userList->model());
- Aki::Irc::User *user = model->data(d->userList->currentIndex(), NickListModel::IrcUserRole)
- .value<Aki::Irc::User*>();
- d->socket->rfcMode(name(), QString("-v %1").arg(user->nick()));
- }
- void
- ChannelTab::slotTextSubmitted()
- {
- QString text = d->channelInput->text();
- d->channelInput->clear();
- if (text.startsWith(QChar('/'))) {
- text.remove(0, 1);
- QString command = text.mid(0, text.indexOf(QChar(' '))).toLower();
- text.remove(0, command.length() + 1);
- if (command == QChar('j') || command == "join") {
- QString channel = text.mid(0, text.indexOf(QChar(' ')));
- channel = channel.trimmed();
- if (Aki::Irc::Rfc2812::isValidChannel(channel)) {
- d->socket->rfcJoin(channel);
- }
- } else if (command == "clear") {
- d->channelOutput->clear();
- } else if (command == "invite") {
- QString nick = text.mid(0, text.indexOf(QChar(' ')));
- text.remove(0, nick.length() + 1);
- QString channel = text.trimmed();
- d->socket->rfcInvite(nick, channel);
- } else if (command == "ns" || command == "nickserv") {
- d->socket->rfcPrivmsg("nickserv", text);
- } else if (command == "ghost") {
- QString nick = text.mid(0, text.indexOf(QChar(' ')));
- text.remove(0, nick.length() + 1);
- QString password = text.trimmed();
- d->socket->rfcPrivmsg("nickserv", "GHOST " + nick + ' ' + password);
- } else if (command == "nick") {
- if (!text.isEmpty()) {
- if (text.contains(QChar(' '))) {
- // TODO : Fix ChatView to handle errors.
- } else {
- if (Aki::Irc::Rfc2812::isValidNickname(text.trimmed())) {
- d->socket->rfcNick(text.trimmed());
- } else {
- // TODO: Fix ChatView to handle errors.
- }
- }
- } else {
- // TODO : Fix ChatView to handle errors.
- }
- } else if (command == "me") {
- if (!text.isEmpty()) {
- d->socket->rfcCtcpAction(name(), text);
- d->channelOutput->addCtcpAction(d->nickSelector->currentText(), text);
- } else {
- // TODO : Fix ChatView to handle errors.
- }
- } else if (command == "cs" || command == "chanserv") {
- d->socket->rfcPrivmsg("chanserv", text);
- } else if (command == "mode") {
- if (Aki::Irc::Rfc2812::isValidChannel(name())) {
- QString mode = text.mid(0, text.indexOf(QChar(' ')));
- text.remove(0, mode.length() + 1);
- if (Aki::Irc::Rfc2812::isValidNickname(text)) {
- d->socket->rfcMode(name(), QString("%1 %2").arg(mode, text));
- } else {
- // TODO: Fix ChatView to handle errors.
- }
- } else {
- // TODO: Fix ChatView to handle errors.
- }
- } else if (command == "kick") {
- if (Aki::Irc::Rfc2812::isValidChannel(name())) {
- QString nick = text.mid(0, text.indexOf(QChar(' ')));
- if (Aki::Irc::Rfc2812::isValidNickname(nick)) {
- text.remove(0, nick.length() + 1);
- if (!text.isEmpty()) {
- d->socket->rfcKick(name(), nick, text);
- } else {
- if (!d->config->kickMessage().isEmpty()) {
- d->socket->rfcKick(name(), nick, d->config->kickMessage());
- } else {
- d->socket->rfcKick(name(), nick);
- }
- }
- } else {
- // TODO: Fix the ChatView to handle error messages.
- }
- } else {
- // TODO: Fix the ChatView to handle error messages.
- }
- } else if (command == "ban") {
- } else if (command == "ctcp") {
- if (!text.isEmpty()) {
- QString nick = text.mid(0, text.indexOf(QChar(' ')));
- if (Aki::Irc::Rfc2812::isValidNickname(nick)) {
- text.remove(0, nick.length() + 1);
- if (!text.isEmpty()) {
- d->socket->rfcPrivmsg(nick, QString("\x01%1\x01").arg(text.trimmed()));
- } else {
- // TODO: Fix the ChatView to handle error messages.
- }
- } else {
- // TODO: Fix the ChatView to handle error messages.
- }
- } else {
- // TODO: Fix the ChatView to handle error messages.
- }
- } else if (command == "umode") {
- if (!text.isEmpty()) {
- QString nickname = text.mid(0, text.indexOf(QChar(' ')));
- if (Aki::Irc::Rfc2812::isValidNickname(nickname)) {
- text.remove(0, nickname.length() + 1);
- if (text.isEmpty()) {
- d->socket->rfcMode(nickname);
- } else {
- d->socket->rfcMode(nickname, text.trimmed());
- }
- } else {
- d->socket->rfcMode(d->socket->currentNick(), text.trimmed());
- }
- } else {
- // TODO: Fix the ChatView to handle error messages.
- }
- } else if (command == "who") {
- if (!text.trimmed().isEmpty()) {
- QString channel = text.mid(0, text.indexOf(QChar(' ')));
- if (Aki::Irc::Rfc2812::isValidChannel(channel)) {
- d->socket->rfcWho(channel);
- d->autoRequest << "WHO";
- } else {
- }
- } else {
- d->socket->rfcWho(name());
- }
- }
- } else {
- foreach (Aki::Irc::User *user, d->userList->users()) {
- if (user->nick() == d->socket->currentNick()) {
- QString colour =
- QString("<font color=\"%1\">%2</font>").arg(user->color().name(), user->nick());
- d->channelOutput->addPrivmsg(colour, Aki::Irc::Color::toHtml(text));
- d->socket->rfcPrivmsg(name(), text);
- return;
- }
- }
- }
- }
- ChannelView*
- ChannelTab::view()
- {
- return d->view;
- }
Add Comment
Please, Sign In to add comment