/** * Get the addressbook state of the nickname at the specified nicklistview item. * @param item Item of the nicklistview. * @return Addressbook state. * 0 = not a nick, 1 = nick has no addressbook association, 2 = nick has association */ int NicksOnline::getNickAddressbookState(QListViewItem* item) { int nickState = nsNotANick; QString serverName; QString nickname; if (getItemServerAndNick(item, serverName, nickname)) { Server *server = KonversationApplication::instance()->getConnectionManager()->getServerByName(serverName); if (!server) return nsNotANick; NickInfoPtr nickInfo = server->getNickInfo(nickname); if (nickInfo) { if (nickInfo->getAddressee().isEmpty()) nickState = nsNoAddress; else nickState = nsHasAddress; } else { if (server->getOfflineNickAddressee(nickname).isEmpty()) nickState = nsNoAddress; else nickState = nsHasAddress; } } return nickState; }
/** * Send the file to the contact * @param uid the KABC uid you are sending to. * @param sourceURL a KURL to send. * @param altFileName an alternate filename describing the file * @param fileSize file size in bytes */ void Addressbook::sendFile(const QString &uid, const KURL &sourceURL, const QString &altFileName, uint fileSize) { if(uid.isEmpty()) { focusAndShowErrorMessage(i18n("Another KDE application tried to use Konversation to send a file to a contact, but did not specify any contact to send the file to. This is probably a bug in the other application.")); return; } KABC::Addressee addressee = addressBook->findByUid(uid); if(addressee.isEmpty()) { focusAndShowErrorMessage(i18n("Another KDE application tried to use Konversation to send a file to a contact, but Konversation could not find the specified contact in the KDE address book.")); return; } NickInfoPtr nickInfo = getNickInfo(addressee); if(!nickInfo) { QString user = addressee.fullEmail(); if(!user.isEmpty()) user = "******" + user + ')'; focusAndShowErrorMessage(i18n("Another KDE application tried to use Konversation to send a file to a contact, but the requested user%1 is not currently online.").arg(user)); return; } nickInfo->getServer()->addDccSend(nickInfo->getNickname(), sourceURL, altFileName, fileSize); QWidget *widget = nickInfo->getServer()->getViewContainer()->getWindow(); KWin::demandAttention(widget->winId()); //If activeWindow request is denied, at least demand attention! KWin::activateWindow(widget->winId()); //May or may not work, depending on focus stealing prevention. }
/** * Refreshes the information for the given item in the list. * @param item Pointer to listview item. */ void NicksOnline::refreshItem(QListViewItem* item) { if (!item) return; QString serverName; QString nickname; if (getItemServerAndNick(item, serverName, nickname)) { Server *server = KonversationApplication::instance()->getConnectionManager()->getServerByName(serverName); if (server) { NickInfoPtr nickInfo = server->getNickInfo(nickname); KABC::Addressee addressee; if (nickInfo) addressee = nickInfo->getAddressee(); else addressee = server->getOfflineNickAddressee(nickname); int nickState = 2; if (addressee.isEmpty()) nickState = 1; switch (nickState) { case nsNotANick: break; case nsNoAddress: { item->setPixmap(nlvcKabc, m_kabcIconSet.pixmap( QIconSet::Small, QIconSet::Disabled, QIconSet::Off)); break; } case nsHasAddress: { item->setPixmap(nlvcKabc, m_kabcIconSet.pixmap( QIconSet::Small, QIconSet::Normal, QIconSet::On)); break; } } QString nickAdditionalInfo; bool needWhois = false; if (nickInfo) nickAdditionalInfo = getNickAdditionalInfo(nickInfo, addressee, needWhois); item->setText(nlvcAdditionalInfo, nickAdditionalInfo); if (item == m_nickListView->selectedItem()) setupAddressbookButtons(nickState); } } }
/** * Received from server when a NickInfo changes its information. */ void NicksOnline::slotNickInfoChanged(Server* server, const NickInfoPtr nickInfo) { if (!nickInfo) return; QString nickname = nickInfo->getNickname(); if (!server) return; QString serverName = server->getServerName(); QListViewItem* item = getServerAndNickItem(serverName, nickname); refreshItem(item); }
/** * Send a single message to the specified addressee * Any response will be handled by the IM client as a normal * conversation. * @param uid the KABC uid you want to chat with. * @param message the message to send them. */ void Addressbook::messageContact( const QString &uid, const QString& message ) { if(uid.isEmpty()) { focusAndShowErrorMessage(i18n("Another KDE application tried to use Konversation for instant messaging, but did not specify any contact to send the message to. This is probably a bug in the other application.")); return; } KABC::Addressee addressee = addressBook->findByUid(uid); if(addressee.isEmpty()) { focusAndShowErrorMessage(i18n("Another KDE application tried to use Konversation for instant messaging, but Konversation could not find the specified contact in the KDE address book.")); return; } NickInfoPtr nickInfo = getNickInfo(addressee); if(!nickInfo) { QString user = addressee.fullEmail(); if(!user.isEmpty()) user = "******" + user + ')'; focusAndShowErrorMessage(i18n("Another KDE application tried to use Konversation for instant messaging, but the requested user%1 is not online.").arg(user)); return; } nickInfo->getServer()->dcopSay(nickInfo->getNickname(), message); }
QString Nick::calculateLabel1() { NickInfoPtr nickinfo = getChannelNick()->getNickInfo(); KABC::Addressee addressee = nickinfo->getAddressee(); if(!addressee.realName().isEmpty()) //if no addressee, realName will be empty { return nickinfo->getNickname() + " (" + addressee.realName() + ')'; } else if(Preferences::showRealNames() && !nickinfo->getRealName().isEmpty()) { return nickinfo->getNickname() + " (" + nickinfo->getRealName() + ')'; } return nickinfo->getNickname(); }
/** * Perform an addressbook command (edit contact, create new contact, * change/delete association.) * @param id The command id. @ref CommandIDs. * * The operation is performed on the nickname at the currently-selected item in * the nicklistview. * * Also refreshes the nicklistview display to reflect the new addressbook state * for the nick. */ void NicksOnline::doCommand(int id) { if(id < 0) { return; } QString serverName; QString nickname; QListViewItem* item = m_nickListView->selectedItem(); if(!getItemServerAndNick(item, serverName, nickname)) { return; } // Get the server object corresponding to the server name. Server* server = KonversationApplication::instance()->getConnectionManager()->getServerByName(serverName); if (!server) return; // Get NickInfo object corresponding to the nickname. NickInfoPtr nickInfo = server->getNickInfo(nickname); // Get addressbook entry for the nick. KABC::Addressee addressee; if(nickInfo) { addressee = nickInfo->getAddressee(); } else { addressee = server->getOfflineNickAddressee(nickname); } switch(id) { case ciSendEmail: Konversation::Addressbook::self()->sendEmail(addressee); return; //no need to refresh item case ciAddressbookEdit: Konversation::Addressbook::self()->editAddressee(addressee.uid()); return; //no need to refresh item - nickinfo changed will be called anyway. case ciAddressbookChange: if(nickInfo) { nickInfo->showLinkAddressbookUI(); } else { LinkAddressbookUI *linkaddressbookui = new LinkAddressbookUI(server->getViewContainer()->getWindow(), NULL, nickname, server->getServerName(), server->getDisplayName(), addressee.realName()); linkaddressbookui->show(); } break; case ciAddressbookNew: case ciAddressbookDelete: { Konversation::Addressbook *addressbook = Konversation::Addressbook::self(); if(addressbook && addressbook->getAndCheckTicket()) { if(id == ciAddressbookDelete) { if (addressee.isEmpty()) { return; } addressbook->unassociateNick(addressee, nickname, server->getServerName(), server->getDisplayName()); } else { addressee.setGivenName(nickname); addressee.setNickName(nickname); addressbook->associateNickAndUnassociateFromEveryoneElse(addressee, nickname, server->getServerName(), server->getDisplayName()); } if(addressbook->saveTicket()) { //saveTicket will refresh the addressees for us. if(id == ciAddressbookNew) { Konversation::Addressbook::self()->editAddressee(addressee.uid()); } } } break; } case ciJoinChannel: { // only join real channels if (static_cast<NicksOnlineItem*>(m_nickListView->selectedItem())->type() == NicksOnlineItem::ChannelItem) { QString contactChannel = m_nickListView->selectedItem()->text(nlvcChannel); server->queue( "JOIN "+contactChannel ); } break; } case ciWhois: server->queue("WHOIS "+nickname); return; case ciOpenQuery: NickInfoPtr nickInfo = server->obtainNickInfo(nickname); class Query* query = server->addQuery(nickInfo, true /*we initiated*/); emit showView(query); return; } refreshItem(item); }
/** * Refresh the nicklistview for a single server. * @param server The server to be refreshed. */ void NicksOnline::updateServerOnlineList(Server* servr) { bool newNetworkRoot = false; QString serverName = servr->getServerName(); QString networkName = servr->getDisplayName(); QListViewItem* networkRoot = findNetworkRoot(networkName); // If network is not in our list, add it. if (!networkRoot) { networkRoot = new NicksOnlineItem(NicksOnlineItem::NetworkRootItem,m_nickListView,networkName); newNetworkRoot = true; } // Store server name in hidden column. // Note that there could be more than one server in the network connected, // but it doesn't matter because all the servers in a network have the same // watch list. networkRoot->setText(nlvcServerName, serverName); // Update list of servers in the network that are connected. QStringList serverList = QStringList::split(",", networkRoot->text(nlvcAdditionalInfo)); if (!serverList.contains(serverName)) serverList.append(serverName); networkRoot->setText(nlvcAdditionalInfo, serverList.join(",")); // Get item in nicklistview for the Offline branch. QListViewItem* offlineRoot = findItemType(networkRoot, NicksOnlineItem::OfflineItem); if (!offlineRoot) { offlineRoot = new NicksOnlineItem(NicksOnlineItem::OfflineItem,networkRoot,i18n("Offline")); offlineRoot->setText(nlvcServerName, serverName); } // Get watch list. QStringList watchList = servr->getWatchList(); QStringList::iterator itEnd = watchList.end(); QString nickname; for (QStringList::iterator it = watchList.begin(); it != itEnd; ++it) { nickname = (*it); NickInfoPtr nickInfo = getOnlineNickInfo(networkName, nickname); if (nickInfo && nickInfo->getPrintedOnline()) { // Nick is online. // Which server did NickInfo come from? Server* server=nickInfo->getServer(); // Get addressbook entry (if any) for the nick. KABC::Addressee addressee = nickInfo->getAddressee(); // Construct additional information string for nick. bool needWhois = false; QString nickAdditionalInfo = getNickAdditionalInfo(nickInfo, addressee, needWhois); // Remove from offline branch if present. QListViewItem* item = findItemChild(offlineRoot, nickname, NicksOnlineItem::NicknameItem); if (item) delete item; // Add to network if not already added. QListViewItem* nickRoot = findItemChild(networkRoot, nickname, NicksOnlineItem::NicknameItem); if (!nickRoot) nickRoot = new NicksOnlineItem(NicksOnlineItem::NicknameItem,networkRoot, nickname, nickAdditionalInfo); nickRoot->setText(nlvcAdditionalInfo, nickAdditionalInfo); nickRoot->setText(nlvcServerName, serverName); // If no additional info available, request a WHOIS on the nick. if (!m_whoisRequested) { if (needWhois) { requestWhois(networkName, nickname); m_whoisRequested = true; } } // Set Kabc icon if the nick is associated with an addressbook entry. if (!addressee.isEmpty()) nickRoot->setPixmap(nlvcKabc, m_kabcIconSet.pixmap( QIconSet::Small, QIconSet::Normal, QIconSet::On)); else nickRoot->setPixmap(nlvcKabc, m_kabcIconSet.pixmap( QIconSet::Small, QIconSet::Disabled, QIconSet::Off)); QStringList channelList = server->getNickChannels(nickname); QStringList::iterator itEnd2 = channelList.end(); for (QStringList::iterator it2 = channelList.begin(); it2 != itEnd2; ++it2) { // Known channels where nickname is online and mode in each channel. // FIXME: If user connects to multiple servers in same network, the // channel info will differ between the servers, resulting in inaccurate // mode and led info displayed. QString channelName = (*it2); ChannelNickPtr channelNick = server->getChannelNick(channelName, nickname); QString nickMode; if (channelNick->hasVoice()) nickMode = nickMode + i18n(" Voice"); if (channelNick->isHalfOp()) nickMode = nickMode + i18n(" HalfOp"); if (channelNick->isOp()) nickMode = nickMode + i18n(" Operator"); if (channelNick->isOwner()) nickMode = nickMode + i18n(" Owner"); if (channelNick->isAdmin()) nickMode = nickMode + i18n(" Admin"); QListViewItem* channelItem = findItemChild(nickRoot, channelName, NicksOnlineItem::ChannelItem); if (!channelItem) channelItem = new NicksOnlineItem(NicksOnlineItem::ChannelItem,nickRoot, channelName, nickMode); channelItem->setText(nlvcAdditionalInfo, nickMode); // Icon for mode of nick in each channel. Images::NickPrivilege nickPrivilege = Images::Normal; if (channelNick->hasVoice()) nickPrivilege = Images::Voice; if (channelNick->isHalfOp()) nickPrivilege = Images::HalfOp; if (channelNick->isOp()) nickPrivilege = Images::Op; if (channelNick->isOwner()) nickPrivilege = Images::Owner; if (channelNick->isAdmin()) nickPrivilege = Images::Admin; if (server->getJoinedChannelMembers(channelName) != 0) channelItem->setPixmap(nlvcChannel, KonversationApplication::instance()->images()->getNickIcon(nickPrivilege, false)); else channelItem->setPixmap(nlvcChannel, KonversationApplication::instance()->images()->getNickIcon(nickPrivilege, true)); } // Remove channel if nick no longer in it. QListViewItem* child = nickRoot->firstChild(); while (child) { QListViewItem* nextChild = child->nextSibling(); if (channelList.find(child->text(nlvcNick)) == channelList.end()) delete child; child = nextChild; } } else { // Nick is offline. // Remove from online nicks, if present. QListViewItem* item = findItemChild(networkRoot, nickname, NicksOnlineItem::NicknameItem); if (item) delete item; // Add to offline list if not already listed. QListViewItem* nickRoot = findItemChild(offlineRoot, nickname, NicksOnlineItem::NicknameItem); if (!nickRoot) nickRoot = new NicksOnlineItem(NicksOnlineItem::NicknameItem,offlineRoot, nickname); nickRoot->setText(nlvcServerName, serverName); // Get addressbook entry for the nick. KABC::Addressee addressee = servr->getOfflineNickAddressee(nickname); // Format additional information for the nick. bool needWhois = false; QString nickAdditionalInfo = getNickAdditionalInfo(0, addressee, needWhois); nickRoot->setText(nlvcAdditionalInfo, nickAdditionalInfo); // Set Kabc icon if the nick is associated with an addressbook entry. if (!addressee.isEmpty()) nickRoot->setPixmap(nlvcKabc, m_kabcIconSet.pixmap( QIconSet::Small, QIconSet::Normal, QIconSet::On)); else nickRoot->setPixmap(nlvcKabc, m_kabcIconSet.pixmap( QIconSet::Small, QIconSet::Disabled, QIconSet::Off)); } } // Erase nicks no longer being watched. QListViewItem* item = networkRoot->firstChild(); while (item) { QListViewItem* nextItem = item->nextSibling(); if (static_cast<NicksOnlineItem*>(item)->type() != NicksOnlineItem::OfflineItem) { QString nickname = item->text(nlvcNick); if ((watchList.find(nickname) == watchList.end()) && (serverName == item->text(nlvcServerName))) delete item; } item = nextItem; } item = offlineRoot->firstChild(); if(item) { while (item) { QListViewItem* nextItem = item->nextSibling(); QString nickname = item->text(nlvcNick); if ((watchList.find(nickname) == watchList.end()) && (serverName == item->text(nlvcServerName))) delete item; item = nextItem; } } else { delete offlineRoot; } // Expand server if newly added to list. if (newNetworkRoot) { networkRoot->setOpen(true); // Connect server NickInfo updates. connect (servr, SIGNAL(nickInfoChanged(Server*, const NickInfoPtr)), this, SLOT(slotNickInfoChanged(Server*, const NickInfoPtr))); } }
/** * Return a string containing formatted additional information about a nick. * @param nickInfo A pointer to NickInfo structure for the nick. May be Null. * @param addressee Addressbook entry for the nick. May be empty. * @return A string formatted for display containing the information * about the nick. * @return needWhois True if a WHOIS needs to be performed on the nick * to get additional information. */ QString NicksOnline::getNickAdditionalInfo(NickInfoPtr nickInfo, KABC::Addressee addressee, bool& needWhois) { QString info; if (!addressee.isEmpty()) { if (addressee.fullEmail().isEmpty()) info += addressee.realName(); else info += addressee.fullEmail(); } QString niInfo; if (nickInfo) { if (nickInfo->isAway()) { niInfo += i18n("Away"); if (!nickInfo->getAwayMessage().isEmpty()) niInfo += '(' + nickInfo->getAwayMessage() + ')'; } if (!nickInfo->getHostmask().isEmpty()) niInfo += ' ' + nickInfo->getHostmask(); if (!nickInfo->getRealName().isEmpty()) niInfo += " (" + nickInfo->getRealName() + ')'; if (!nickInfo->getNetServer().isEmpty()) { niInfo += i18n( " online via %1" ).arg( nickInfo->getNetServer() ); if (!nickInfo->getNetServerInfo().isEmpty()) niInfo += " (" + nickInfo->getNetServerInfo() + ')'; } if (!nickInfo->getOnlineSince().isNull()) niInfo += i18n( " since %1" ).arg( nickInfo->getPrettyOnlineSince() ); } needWhois = niInfo.isEmpty(); if (!info.isEmpty() && !needWhois) info += ' '; return info + niInfo; }