#include "ofApp.h"
void ofApp::setup(){
ofSetWindowTitle("oscChatSystemExample");
ofSetFrameRate(60);
ofSetVerticalSync(true);
ofBackground(150);
font.load("futura_book.otf", 12);
titleFont.load("futura_book.otf", 20);
ofSetLogLevel(OF_LOG_VERBOSE);
serverRecvPort = 9000;
serverReceiver.setup(serverRecvPort);
maxServerMessages = 38;
clientDestination = "localhost";
clientSendPort = 9000;
clientSender.setup(clientDestination, clientSendPort);
clientRecvPort = clientSendPort + 1;
clientReceiver.setup(clientRecvPort);
}
void ofApp::update(){
while(serverReceiver.hasWaitingMessages()){
ofxOscMessage m;
serverReceiver.getNextMessage(m);
ofLogVerbose() << "Server received msg " + getOscMsgAsString(m) + " from " + m.getRemoteHost();
if(m.getAddress() == "/typing"){
string incomingHost = m.getRemoteHost();
if(std::find(knownClients.begin(), knownClients.end(), incomingHost) == knownClients.end()){
knownClients.push_back(incomingHost);
}
if(m.getNumArgs() > 0 && m.getArgType(0) == OFXOSC_TYPE_STRING){
if(serverMessages.size() == maxServerMessages){
serverMessages.erase(serverMessages.begin());
}
serverMessages.push_back(m.getArgAsString(0));
broadcastReceivedMessage(m.getArgAsString(0));
}
}
else{
ofLogWarning( ) << "Server got weird message: " + m.getAddress();
}
}
while(clientReceiver.hasWaitingMessages()){
ofxOscMessage m;
clientReceiver.getNextMessage(m);
ofLogNotice() << "Client just received a message";
if(m.getAddress() == "/chatlog"){
if(m.getNumArgs() > 0){
if(m.getArgType(0) == OFXOSC_TYPE_STRING){
string oldMessages = clientMessages;
clientMessages = m.getArgAsString(0) + "\n" + oldMessages;
}
}
}
}
if(ofGetFrameNum() == 60){
clientReceiver.setup(clientRecvPort);
serverReceiver.setup(serverRecvPort);
}
}
void ofApp::draw(){
string instructions =
"Chat client\nSending messages to " + string(clientDestination) + ":" +
ofToString(clientSendPort) + "\n" +
"Type to create a new message.\n" +
"Hit RETURN to send!";
titleFont.drawString(instructions, 10, 37);
titleFont.drawString(clientTyping, 10, 160);
font.drawString(clientMessages, 10, 180);
string title = "Chat server";
titleFont.drawString(title, 542, 37);
title = "Listening for messages on port " + ofToString(serverRecvPort) + ".\n" +
"Known chatters: " + ofToString(knownClients.size());
titleFont.drawString(title, 542, 65);
serverTyping = "";
for(unsigned int i = 0; i < serverMessages.size(); i++){
string oldTyping = serverTyping;
serverTyping = oldTyping + "\n" + serverMessages[i];
}
font.drawString(serverTyping, 542, 100);
}
void ofApp::keyPressed(int key){
if(key != OF_KEY_RETURN){
if(key != OF_KEY_BACKSPACE){
clientTyping += key;
}
else{
if(clientTyping.size() > 0){
clientTyping.erase(clientTyping.end() - 1);
}
}
}
else{
ofxOscMessage m;
m.setAddress("/typing");
m.addStringArg(clientTyping);
clientSender.sendMessage(m, false);
clientTyping = "";
}
}
void ofApp::keyReleased(int key){
}
void ofApp::mouseMoved(int x, int y){
}
void ofApp::mouseDragged(int x, int y, int button){
}
void ofApp::mousePressed(int x, int y, int button){
}
void ofApp::mouseReleased(int x, int y, int button){
}
void ofApp::mouseEntered(int x, int y){
}
void ofApp::mouseExited(int x, int y){
}
void ofApp::windowResized(int w, int h){
}
void ofApp::gotMessage(ofMessage msg){
}
void ofApp::dragEvent(ofDragInfo dragInfo){
}
string ofApp::getOscMsgAsString(ofxOscMessage m){
string msg_string;
msg_string = m.getAddress();
msg_string += ":";
for(size_t i = 0; i < m.getNumArgs(); i++){
msg_string += " " + m.getArgTypeName(i);
msg_string += ":";
if(m.getArgType(i) == OFXOSC_TYPE_INT32){
msg_string += ofToString(m.getArgAsInt32(i));
}
else if(m.getArgType(i) == OFXOSC_TYPE_FLOAT){
msg_string += ofToString(m.getArgAsFloat(i));
}
else if(m.getArgType(i) == OFXOSC_TYPE_STRING){
msg_string += m.getArgAsString(i);
}
else{
msg_string += "unhandled argument type " + m.getArgTypeName(i);
}
}
return msg_string;
}
void ofApp::broadcastReceivedMessage(string chatmessage){
ofxOscMessage m;
m.setAddress("/chatlog");
m.addStringArg(chatmessage);
for(unsigned int i = 0; i < knownClients.size(); i++){
serverSender.setup(knownClients[i], serverRecvPort + 1);
m.setRemoteEndpoint(knownClients[i], serverRecvPort + 1);
serverSender.sendMessage(m, false);
ofLogVerbose() << "Server broadcast message " + m.getArgAsString(0) +
" to " + m.getRemoteHost() +
":" + ofToString(m.getRemotePort());
}
}
Comments