/* statisticscontact.h Copyright (c) 2003-2004 by Marc Cramdal ************************************************************************* * * * 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. * * * ************************************************************************* */ #ifndef STATISTICSCONTACT_H #define STATISTICSCONTACT_H #include "kopeteonlinestatus.h" #include "kopetemessage.h" class StatisticsDB; class TQDateTime; class StatisticsContact { public: StatisticsContact(Kopete::MetaContact *mc, StatisticsDB *db); /** * We save all stats to the database (commonstats) */ ~StatisticsContact(); /* * Access method */ /** \brief Access method * \return m_db */ StatisticsDB *db() { return m_db; } /** \brief Access method * \return m_metaContact */ Kopete::MetaContact *metaContact() { return m_metaContact; } /** \brief Access method * \return m_statisticsContactId */ TQString statisticsContactId() { return m_statisticsContactId; } /** \brief Access method * \return m_oldStatus */ Kopete::OnlineStatus::StatusType oldStatus() { return m_oldStatus; } /** \brief Access method * \return m_oldStatusDateTime */ TQDateTime oldStatusDateTime() { return m_oldStatusDateTime; } /** \brief Access method * \return m_messageLength */ int messageLength() { return m_messageLength; } /** \brief Access method * \return m_timeBetweenTwoMessages */ int timeBetweenTwoMessages() { return m_timeBetweenTwoMessages; } /** * \brief Access method * \return m_lastTalk */ TQDateTime lastTalk() { return m_lastTalk; } /** * \brief Access method * \return m_lastPresent */ TQDateTime lastPresent() { return m_lastPresent; } /** * \brief sets \p m_isChatWindowOpen to true */ void setIsChatWindowOpen(bool c) { m_isChatWindowOpen = c; } /* * Method performing some useful actions */ /** * \brief update the events database with the new statuss */ void onlineStatusChanged(Kopete::OnlineStatus::StatusType status); /** * \brief update the average time between to messages for this contact * Should be called when a new message is received by this contact */ void newMessageReceived(Kopete::Message& m); /** * \returns true if contact was status at dt, false else. */ bool wasStatus(TQDateTime dt, Kopete::OnlineStatus::StatusType status); /** * \returns the status of the contact at dt. Return false if dt is invalid. */ TQString statusAt(TQDateTime dt); /** * \returns the main (most used) status of the contact at date (not time) dt. return false if dt is invalid. */ TQString mainStatusDate(const TQDate& date); /* * Prevision methods */ /** // * \brief Give informations on when the next event will occur // * // * \param status the status to be checked. // * \retval nextEventDateTime the next event average prevision datetime. // */ // TQDateTime nextEvent(const Kopete::OnlineStatus::StatusType& status); // // /** // * \brief Convenience method for nextEvent with Offline status // */ // TQDateTime nextOfflineEvent(); // // /** // * \brief Convenience method for nextEvent with Online status // */ // TQDateTime nextOnlineEvent(); /** * \brief computes the main "status" events for the contact */ TQValueList mainEvents(const Kopete::OnlineStatus::StatusType& status); /// \brief used by mainEvents() TQValueList computeCentroids(const TQValueList& centroids, const TQValueList& values); /** * \brief adds contact to "contacts" database and generates m_statisticsContactId if needed */ void contactAdded( Kopete::Contact *c ); /** * \brief removes contact from "contacts" database */ void contactRemoved( Kopete::Contact *c ); /** * \brief removes all records from database that are related to this class and clears m_statisticsContactId */ void removeFromDB(); private: /** * \brief initializes this object and sets m_statisticsContactId * */ void initialize(Kopete::Contact *c); /** * \brief Checks if the value name exists in "commonstats" table, if not, add the row. * * \param name the name of the entry to be checked * \param statVar1 retrieve this var from the database. If it doesn't exists, get it from \p defaultValue1 * \param statVar2 retrieve this var from the database. If it doesn't exists, get it from \p defaultValue2 * \param defaultValue1 defaultValue for \p statVar1 * \param defaultValue2 defaultValue for \p statVar2 * \retval statvar1 * \retval statvar2 */ void commonStatsCheck(const TQString name, TQString& statVar1, TQString& statVar2, const TQString defaultValue1 = "", const TQString defaultValue2 = ""); /** * @brief Same as commonStatsCheck for integers. * Provided for convenience */ void commonStatsCheck(const TQString name, int& statVar1, int& statVar2, const int defaultValue1 = 0, const int defaultValue2 = -1); /** * @brief Save a value in the "commonstats" table * \param name the name of the entry to be saved * \param statVar1 what we are going to store in the first column for this entry * \param statVar2 the second stat we can save in this table for this entry * \param statVarChanged if this param is true, we save. Else, we don't. Spare some disk usage. */ void commonStatsSave(const TQString name, const TQString statVar1, const TQString statVar2, const bool statVarChanged); /** * Kopete::MetaContact linked to this StatisticsContact * Each StatisticsContact object _has_ to be linked to a metaContact */ Kopete::MetaContact *m_metaContact; /** * Required to be able to write to the database */ StatisticsDB *m_db; /** * The interest of statistics contact is to manage the changes of status * in order to correctly update the database. That's why here we keep the oldStatus */ Kopete::OnlineStatus::StatusType m_oldStatus; /// We keep the old status datetime here TQDateTime m_oldStatusDateTime; /** * Average time this user takes between two of his messages * It may be used to compute a "speed" or "availability" for this contact */ int m_timeBetweenTwoMessages; bool m_timeBetweenTwoMessagesChanged; /// Date at which the last message was received. /// Used to compute m_timeBetweenTwoMessages TQDateTime m_lastMessageReceived; /// This is the ponderation corresponding to m_timeBetweenTwoMessagesOn int m_timeBetweenTwoMessagesOn; /// We don't count time if a chatwindow isn't open bool m_isChatWindowOpen; /** * Average length of contact's messages */ int m_messageLength; bool m_messageLengthChanged; /// This is the ponderation corresponding to m_messageLength int m_messageLengthOn; /** * Last time user talked with this contact */ TQDateTime m_lastTalk; bool m_lastTalkChanged; /** * Last time user was present (=online or away) */ TQDateTime m_lastPresent; bool m_lastPresentChanged; /** * Unique id that identifies StatisticsContact * It's also identifier for database records */ TQString m_statisticsContactId; }; #endif