/*
* vim: softtabstop=4 shiftwidth=4 cindent foldmethod=marker expandtab
*
* $LastChangedDate$
* $Revision$
* $LastChangedBy$
* $URL$
*
* Copyright 2009-2011 Eric Connell
*
* This file is part of Mangler.
*
* Mangler 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 3 of the License, or
* (at your option) any later version.
*
* Mangler is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Mangler. If not, see .
*/
#include "mangler.h"
#include "manglerprivchat.h"
#include "manglercharset.h"
extern const char ManglerUI[];
ManglerPrivChat::ManglerPrivChat(uint16_t userid) {
// We instantiate a new builder object here to get a completely new window (hopefully)
builder = Gtk::Builder::create_from_string(ManglerUI, "privChatWindow");
builder->get_widget("privChatWindow", chatWindow);
chatWindow->signal_hide().connect(sigc::mem_fun(this, &ManglerPrivChat::chatWindowCloseChat_clicked_cb));
chatWindow->set_title(chatWindow->get_title() + " - " + nameFromId(userid));
this->remoteUserId = userid;
builder->get_widget("privSendChat", sendButton);
sendButton->signal_clicked().connect(sigc::mem_fun(this, &ManglerPrivChat::chatWindowSendChat_clicked_cb));
builder->get_widget("privChatClose", closeButton);
closeButton->signal_clicked().connect(sigc::mem_fun(this, &ManglerPrivChat::chatWindowCloseChat_clicked_cb));
builder->get_widget("privChatBox", chatBox);
builder->get_widget("privChatMessage", chatMessage);
v3_start_privchat(remoteUserId);
chatWindow->present();
}
void ManglerPrivChat::chatWindowSendChat_clicked_cb(void) {
if (chatMessage->get_text_length()) {
v3_send_privchat_message(remoteUserId, (char *)ustring_to_c(chatMessage->get_text()).c_str());
chatMessage->set_text("");
}
}
void ManglerPrivChat::chatWindowCloseChat_clicked_cb(void) {
v3_end_privchat(remoteUserId);
chatWindow->hide();
}
void ManglerPrivChat::addMessage(Glib::ustring message) {
char timestamp[200];
time_t t;
struct tm *tmp;
struct timeval tv;
Glib::RefPtr buffer = chatBox->get_buffer();
if (Mangler::config["ChatTimestamps"].toBool()) {
gettimeofday(&tv, NULL);
t = tv.tv_sec;
tmp = localtime(&t);
if (strftime(timestamp, sizeof(timestamp), "%T", tmp) != 0) {
message = "[" + Glib::ustring(timestamp) + "] " + message;
}
}
buffer->insert(buffer->end(), message + "\n");
chatBox->scroll_to(buffer->create_mark(buffer->end()), 0.0);
}
void ManglerPrivChat::remoteClosed() {
addMessage("\n*** remote user closed connection");
sendButton->set_sensitive(false);
}
void ManglerPrivChat::remoteAway() {
addMessage("\n*** remote user is now away");
}
void ManglerPrivChat::remoteBack() {
addMessage("\n*** remote user is back");
}
void ManglerPrivChat::remoteReopened() {
addMessage("\n*** remote user has reopened chat window");
}
void ManglerPrivChat::addChatMessage(uint16_t id, Glib::ustring message) {
addMessage("[" + nameFromId(id) + "]: " + message);
}
Glib::ustring ManglerPrivChat::nameFromId(uint16_t user_id) {
v3_user *u = v3_get_user(user_id);
Glib::ustring name = "";
if (u) {
name = c_to_ustring(u->name);
v3_free_user(u);
} else {
name = "unknown";
}
return name;
}