diff options
Diffstat (limited to 'src/localplayer.cpp')
-rw-r--r-- | src/localplayer.cpp | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 17641ed4..a4560030 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -80,10 +80,15 @@ LocalPlayer::LocalPlayer(int id, int subtype): mPathSetByMouse(false), mLocalWalkTime(-1), mMessageTime(0), - mShowIp(false) + mShowIp(false), + mAwayDialog(0), + mAfkTime(0), + mAwayMode(false) { listen(CHANNEL_ATTRIBUTES); + mAwayListener = new AwayListener(); + mUpdateName = true; setShowName(config.getValue("showownname", 1)); @@ -94,6 +99,8 @@ LocalPlayer::LocalPlayer(int id, int subtype): LocalPlayer::~LocalPlayer() { + delete mAwayDialog; + delete mAwayListener; } void LocalPlayer::logic() @@ -1110,3 +1117,58 @@ void LocalPlayer::event(Channels channel, const Mana::Event &event) Being::event(channel, event); } + +void LocalPlayer::changeAwayMode() +{ + mAwayMode = !mAwayMode; + mAfkTime = 0; + if (mAwayMode) + { + mAwayDialog = new OkDialog(_("Away"), + config.getValue("afkMessage", "I am away from keyboard")); + mAwayDialog->addActionListener(mAwayListener); + } + + mAwayDialog = 0; +} + +void LocalPlayer::setAway(const std::string &message) +{ + if (!message.empty()) + config.setValue("afkMessage", message); + changeAwayMode(); +} + +void LocalPlayer::afkRespond(ChatTab *tab, const std::string &nick) +{ + if (mAwayMode) + { + if (mAfkTime == 0 + || cur_time < mAfkTime + || cur_time - mAfkTime > AWAY_LIMIT_TIMER) + { + std::string msg = "*AFK*: " + + config.getValue("afkMessage", "I am away from keyboard"); + + Net::getChatHandler()->privateMessage(nick, msg); + if (!tab) + { + localChatTab->chatLog(getName() + " : " + msg, + ACT_WHISPER, false); + } + else + { + tab->chatLog(getName(), msg); + } + mAfkTime = cur_time; + } + } +} + +void AwayListener::action(const gcn::ActionEvent &event) +{ + if (event.getId() == "ok" && player_node->getAwayMode()) + { + player_node->changeAwayMode(); + } +} |