You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
446 lines
14 KiB
446 lines
14 KiB
/*
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
*/
|
|
|
|
/*
|
|
Nick Information
|
|
begin: Sat Jan 17 2004
|
|
copyright: (C) 2004 by Gary Cramblitt
|
|
email: garycramblitt@comcast.net
|
|
*/
|
|
|
|
/*
|
|
The NickInfo object is a data container for information about a single nickname.
|
|
It is owned by the Server object and should NOT be deleted by anything other than Server.
|
|
Store a pointer to this with NickInfoPtr
|
|
*/
|
|
|
|
#include "nickinfo.h"
|
|
#include "konversationapplication.h"
|
|
#include "linkaddressbook/addressbook.h"
|
|
#include "linkaddressbook/linkaddressbookui.h"
|
|
#include "konversationmainwindow.h"
|
|
#include "viewcontainer.h"
|
|
#include "server.h"
|
|
|
|
#include <tqtooltip.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
|
|
NickInfo::NickInfo(const TQString& nick, Server* server): KShared()
|
|
{
|
|
m_addressee=Konversation::Addressbook::self()->getKABCAddresseeFromNick(nick, server->getServerName(), server->getDisplayName());
|
|
m_nickname = nick;
|
|
m_loweredNickname = nick.lower();
|
|
m_owningServer = server;
|
|
m_away = false;
|
|
m_notified = false;
|
|
m_identified = false;
|
|
m_printedOnline = true;
|
|
|
|
if(!m_addressee.isEmpty())
|
|
Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid(), 4);
|
|
|
|
connect( Konversation::Addressbook::self()->getAddressBook(), TQT_SIGNAL( addressBookChanged( AddressBook * ) ), this, TQT_SLOT( refreshAddressee() ) );
|
|
connect( Konversation::Addressbook::self(), TQT_SIGNAL(addresseesChanged()), this, TQT_SLOT(refreshAddressee()));
|
|
|
|
m_changedTimer = new TQTimer( this);
|
|
connect(m_changedTimer, TQT_SIGNAL( timeout()), TQT_SLOT(emitNickInfoChanged()));
|
|
|
|
// reset nick color
|
|
m_nickColor = 0;
|
|
}
|
|
|
|
NickInfo::~NickInfo()
|
|
{
|
|
if(!m_addressee.isEmpty())
|
|
Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid(), 1);
|
|
}
|
|
|
|
// Get properties of NickInfo object.
|
|
TQString NickInfo::getNickname() const { return m_nickname; }
|
|
TQString NickInfo::loweredNickname() const { return m_loweredNickname; }
|
|
TQString NickInfo::getHostmask() const { return m_hostmask; }
|
|
|
|
bool NickInfo::isAway() const { return m_away; }
|
|
TQString NickInfo::getAwayMessage() const { return m_awayMessage; }
|
|
TQString NickInfo::getIdentdInfo() const { return m_identdInfo; }
|
|
TQString NickInfo::getVersionInfo() const { return m_versionInfo; }
|
|
bool NickInfo::isNotified() const { return m_notified; }
|
|
TQString NickInfo::getRealName() const { return m_realName; }
|
|
TQString NickInfo::getNetServer() const { return m_netServer; }
|
|
TQString NickInfo::getNetServerInfo() const { return m_netServerInfo; }
|
|
TQDateTime NickInfo::getOnlineSince() const { return m_onlineSince; }
|
|
|
|
uint NickInfo::getNickColor()
|
|
{
|
|
// do we already have a color?
|
|
if(!m_nickColor)
|
|
{
|
|
int nickvalue = 0;
|
|
|
|
for (uint index = 0; index < m_nickname.length(); index++)
|
|
{
|
|
nickvalue += m_nickname[index].unicode();
|
|
}
|
|
|
|
m_nickColor = (nickvalue % 8) + 1;
|
|
}
|
|
// return color offset -1 (since we store it +1 for 0 checking)
|
|
return m_nickColor-1;
|
|
}
|
|
|
|
bool NickInfo::isIdentified() const { return m_identified; }
|
|
|
|
TQString NickInfo::getPrettyOnlineSince() const
|
|
{
|
|
TQString prettyOnlineSince;
|
|
int daysto = m_onlineSince.date().daysTo( TQDate::currentDate());
|
|
if(daysto == 0) prettyOnlineSince = i18n("Today");
|
|
else if(daysto == 1) prettyOnlineSince = i18n("Yesterday");
|
|
else prettyOnlineSince = m_onlineSince.toString("ddd d MMMM yyyy");
|
|
//TODO - we should use KLocale for this
|
|
prettyOnlineSince += ", " + m_onlineSince.toString("h:mm ap");
|
|
|
|
return prettyOnlineSince;
|
|
}
|
|
|
|
// Return the Server object that owns this NickInfo object.
|
|
Server* NickInfo::getServer() const { return m_owningServer; }
|
|
|
|
// Set properties of NickInfo object.
|
|
void NickInfo::setNickname(const TQString& newNickname)
|
|
{
|
|
Q_ASSERT(!newNickname.isEmpty());
|
|
if(newNickname == m_nickname) return;
|
|
|
|
KABC::Addressee newaddressee = Konversation::Addressbook::self()->getKABCAddresseeFromNick(newNickname, m_owningServer->getServerName(), m_owningServer->getDisplayName());
|
|
//We now know who this person is
|
|
if(m_addressee.isEmpty() && !newaddressee.isEmpty())
|
|
{
|
|
//Associate the old nickname with new contact
|
|
Konversation::Addressbook::self()->associateNick(newaddressee,m_nickname, m_owningServer->getServerName(), m_owningServer->getDisplayName());
|
|
Konversation::Addressbook::self()->saveAddressee(newaddressee);
|
|
}
|
|
else if(!m_addressee.isEmpty() && newaddressee.isEmpty())
|
|
{
|
|
Konversation::Addressbook::self()->associateNick(m_addressee, newNickname, m_owningServer->getServerName(), m_owningServer->getDisplayName());
|
|
Konversation::Addressbook::self()->saveAddressee(newaddressee);
|
|
newaddressee = m_addressee;
|
|
}
|
|
|
|
m_addressee = newaddressee;
|
|
m_nickname = newNickname;
|
|
m_loweredNickname = newNickname.lower();
|
|
|
|
TQString realname = m_addressee.realName();
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::emitNickInfoChanged()
|
|
{
|
|
m_owningServer->emitNickInfoChanged(this);
|
|
emit nickInfoChanged();
|
|
}
|
|
|
|
void NickInfo::startNickInfoChangedTimer()
|
|
{
|
|
if(!m_changedTimer->isActive())
|
|
m_changedTimer->start(3000, true /*single shot*/);
|
|
}
|
|
|
|
void NickInfo::setHostmask(const TQString& newMask)
|
|
{
|
|
if (newMask.isEmpty() || newMask == m_hostmask) return;
|
|
m_hostmask = newMask;
|
|
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setAway(bool state)
|
|
{
|
|
if(state == m_away) return;
|
|
m_away = state;
|
|
|
|
startNickInfoChangedTimer();
|
|
if(!m_addressee.isEmpty())
|
|
Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid());
|
|
}
|
|
|
|
void NickInfo::setIdentified(bool identified)
|
|
{
|
|
if(identified == m_identified) return;
|
|
m_identified = identified;
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setAwayMessage(const TQString& newMessage)
|
|
{
|
|
if(m_awayMessage == newMessage) return;
|
|
m_awayMessage = newMessage;
|
|
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setIdentdInfo(const TQString& newIdentdInfo)
|
|
{
|
|
if(m_identdInfo == newIdentdInfo) return;
|
|
m_identdInfo = newIdentdInfo;
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setVersionInfo(const TQString& newVersionInfo)
|
|
{
|
|
if(m_versionInfo == newVersionInfo) return;
|
|
m_versionInfo = newVersionInfo;
|
|
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setNotified(bool state)
|
|
{
|
|
if(state == m_notified) return;
|
|
m_notified = state;
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setRealName(const TQString& newRealName)
|
|
{
|
|
if (newRealName.isEmpty() || m_realName == newRealName) return;
|
|
m_realName = newRealName;
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setNetServer(const TQString& newNetServer)
|
|
{
|
|
if (newNetServer.isEmpty() || m_netServer == newNetServer) return;
|
|
m_netServer = newNetServer;
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setNetServerInfo(const TQString& newNetServerInfo)
|
|
{
|
|
if (newNetServerInfo.isEmpty() || newNetServerInfo == m_netServerInfo) return;
|
|
m_netServerInfo = newNetServerInfo;
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
void NickInfo::setOnlineSince(const TQDateTime& datetime)
|
|
{
|
|
if (datetime.isNull() || datetime == m_onlineSince) return;
|
|
m_onlineSince = datetime;
|
|
|
|
startNickInfoChangedTimer();
|
|
}
|
|
|
|
KABC::Addressee NickInfo::getAddressee() const { return m_addressee;}
|
|
|
|
void NickInfo::refreshAddressee()
|
|
{
|
|
//m_addressee might not have changed, but information inside it may have.
|
|
KABC::Addressee addressee=Konversation::Addressbook::self()->getKABCAddresseeFromNick(m_nickname, m_owningServer->getServerName(), m_owningServer->getDisplayName());
|
|
if(!addressee.isEmpty() && addressee.uid() != m_addressee.uid())
|
|
{
|
|
//This nick now belongs to a different addressee. We need to update the status for both the old and new addressees.
|
|
Konversation::Addressbook::self()->emitContactPresenceChanged(addressee.uid());
|
|
}
|
|
m_addressee = addressee;
|
|
|
|
startNickInfoChangedTimer();
|
|
|
|
if(!m_addressee.isEmpty())
|
|
Konversation::Addressbook::self()->emitContactPresenceChanged(m_addressee.uid());
|
|
}
|
|
|
|
TQString NickInfo::tooltip() const
|
|
{
|
|
|
|
TQString strTooltip;
|
|
TQTextStream tooltip( &strTooltip, IO_WriteOnly );
|
|
tooltip << "<qt>";
|
|
|
|
tooltip << "<table cellspacing=\"0\" cellpadding=\"0\">";
|
|
tooltipTableData(tooltip);
|
|
tooltip << "</table></qt>";
|
|
return strTooltip;
|
|
}
|
|
|
|
TQString NickInfo::getBestAddresseeName()
|
|
{
|
|
if(!m_addressee.formattedName().isEmpty())
|
|
{
|
|
return m_addressee.formattedName();
|
|
}
|
|
else if(!m_addressee.realName().isEmpty())
|
|
{
|
|
return m_addressee.realName();
|
|
}
|
|
else if(!getRealName().isEmpty())
|
|
{
|
|
return getRealName();
|
|
}
|
|
else
|
|
{
|
|
return getNickname();
|
|
}
|
|
|
|
}
|
|
|
|
void NickInfo::tooltipTableData(TQTextStream &tooltip) const
|
|
{
|
|
tooltip << "<tr><td colspan=\"2\" valign=\"top\">";
|
|
|
|
bool dirty = false;
|
|
KABC::Picture photo = m_addressee.photo();
|
|
KABC::Picture logo = m_addressee.logo();
|
|
bool isimage=false;
|
|
if(photo.isIntern())
|
|
{
|
|
TQMimeSourceFactory::defaultFactory()->setImage( "photo", photo.data() );
|
|
tooltip << "<img src=\"photo\">";
|
|
dirty=true;
|
|
isimage=true;
|
|
}
|
|
else if(!photo.url().isEmpty())
|
|
{
|
|
//JOHNFLUX FIXME TODO:
|
|
//Are there security problems with this? loading from an external refrence?
|
|
//Assuming not.
|
|
tooltip << "<img src=\"" << photo.url() << "\">";
|
|
dirty=true;
|
|
isimage=true;
|
|
}
|
|
if(logo.isIntern())
|
|
{
|
|
TQMimeSourceFactory::defaultFactory()->setImage( "logo", logo.data() );
|
|
tooltip << "<img src=\"logo\">";
|
|
dirty=true;
|
|
isimage=true;
|
|
}
|
|
else if(!logo.url().isEmpty())
|
|
{
|
|
//JOHNFLUX FIXME TODO:
|
|
//Are there security problems with this? loading from an external refrence?
|
|
//Assuming not.
|
|
tooltip << "<img src=\"" << logo.url() << "\">";
|
|
dirty=true;
|
|
isimage=true;
|
|
}
|
|
tooltip << "<b>" << (isimage?"":"<center>");
|
|
if(!m_addressee.formattedName().isEmpty())
|
|
{
|
|
tooltip << m_addressee.formattedName();
|
|
dirty = true;
|
|
}
|
|
else if(!m_addressee.realName().isEmpty())
|
|
{
|
|
tooltip << m_addressee.realName();
|
|
dirty = true;
|
|
}
|
|
else if(!getRealName().isEmpty() && getRealName().lower() != loweredNickname())
|
|
{
|
|
TQString escapedRealName( getRealName() );
|
|
escapedRealName.replace("<","<").replace(">",">");
|
|
tooltip << escapedRealName;
|
|
dirty = true;
|
|
}
|
|
else
|
|
{
|
|
tooltip << getNickname();
|
|
//Don't set dirty if all we have is their nickname
|
|
}
|
|
if(m_identified) tooltip << i18n(" (identified)");
|
|
tooltip << (isimage?"":"</center>") << "</b>";
|
|
|
|
tooltip << "</td></tr>";
|
|
if(!m_addressee.emails().isEmpty())
|
|
{
|
|
tooltip << "<tr><td><b>" << i18n("Email") << ": </b></td><td>";
|
|
tooltip << m_addressee.emails().join(", ");
|
|
tooltip << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
|
|
if(!m_addressee.organization().isEmpty())
|
|
{
|
|
tooltip << "<tr><td><b>" << m_addressee.organizationLabel() << ": </b></td><td>" << m_addressee.organization() << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
if(!m_addressee.role().isEmpty())
|
|
{
|
|
tooltip << "<tr><td><b>" << m_addressee.roleLabel() << ": </b></td><td>" << m_addressee.role() << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
KABC::PhoneNumber::List numbers = m_addressee.phoneNumbers();
|
|
for( KABC::PhoneNumber::List::ConstIterator it = numbers.begin(); it != numbers.end(); ++it)
|
|
{
|
|
tooltip << "<tr><td><b>" << (*it).label() << ": </b></td><td>" << (*it).number() << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
if(!m_addressee.birthday().toString().isEmpty() )
|
|
{
|
|
tooltip << "<tr><td><b>" << m_addressee.birthdayLabel() << ": </b></td><td>" << m_addressee.birthday().toString("ddd d MMMM yyyy") << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
if(!getHostmask().isEmpty())
|
|
{
|
|
tooltip << "<tr><td><b>" << i18n("Hostmask:") << " </b></td><td>" << getHostmask() << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
if(isAway())
|
|
{
|
|
tooltip << "<tr><td><b>" << i18n("Away Message:") << " </b></td><td>";
|
|
if(!getAwayMessage().isEmpty())
|
|
tooltip << getAwayMessage();
|
|
else
|
|
tooltip << i18n("(unknown)");
|
|
tooltip << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
if(!getOnlineSince().toString().isEmpty())
|
|
{
|
|
tooltip << "<tr><td><b>" << i18n("Online Since:") << " </b></td><td>" << getPrettyOnlineSince() << "</td></tr>";
|
|
dirty=true;
|
|
}
|
|
|
|
}
|
|
|
|
void NickInfo::showLinkAddressbookUI()
|
|
{
|
|
LinkAddressbookUI *linkaddressbookui = new LinkAddressbookUI(m_owningServer->getViewContainer()->getWindow(), NULL, m_nickname, m_owningServer->getServerName(), m_owningServer->getDisplayName(), m_realName);
|
|
linkaddressbookui->show();
|
|
|
|
}
|
|
|
|
bool NickInfo::editAddressee() const
|
|
{
|
|
if(m_addressee.isEmpty()) return false;
|
|
|
|
Konversation::Addressbook::self()->editAddressee(m_addressee.uid());
|
|
return true;
|
|
}
|
|
|
|
bool NickInfo::sendEmail() const
|
|
{
|
|
return Konversation::Addressbook::self()->sendEmail(m_addressee);
|
|
}
|
|
|
|
void NickInfo::setPrintedOnline(bool printed)
|
|
{
|
|
m_printedOnline=printed;
|
|
}
|
|
|
|
bool NickInfo::getPrintedOnline()
|
|
{
|
|
if(this)
|
|
return m_printedOnline;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
#include "nickinfo.moc"
|