void UserInterface::JavaScriptHandler::OnMethodCall( WebView* caller, unsigned int remoteObjectID, const WebString& methodName, const JSArray& args ) { // If called on GraphosGame if( remoteObjectID == owner->graphosGame.remote_id() ) { if( methodName == WSLit( "ChangeState" ) && args.size() == 1 ) { if( args[ 0 ].ToString() == WSLit( "Game" ) ) owner->owner->ChangeState( Game ); else if( args[ 0 ].ToString() == WSLit( "Menu" ) ) owner->owner->ChangeState( Menu ); } else if( methodName == WSLit( "SetConfig" ) && args.size() == 2 ) { if( args[ 1 ].IsBoolean() ) Config::Get().SetData( ToString( args[ 0 ].ToString() ), args[ 1 ].ToBoolean() ); else if( args[ 1 ].IsInteger() ) Config::Get().SetData( ToString( args[ 0 ].ToString() ), args[ 1 ].ToInteger() ); else if( args[ 1 ].IsDouble() ) Config::Get().SetData( ToString( args[ 0 ].ToString() ), static_cast<float>( args[ 1 ].ToDouble() ) ); else if( args[ 1 ].IsString() ) Config::Get().SetData( ToString( args[ 0 ].ToString() ), ToString( args[ 1 ].ToString() ) ); } else if( methodName == WSLit( "Reset" ) && args.size() == 0 ) { owner->owner->currentState = Reseting; } } }
JSValue IrcExtension::Handle( const std::string &functionName, const JSArray &args) { // connect(channelName) if (functionName == "connect") { // were in the middle of something if (irc_is_connected(session)) { return JSValue::Undefined(); } if (hThread) { // thread finished? if (WaitForSingleObject(hThread, 0) == WAIT_OBJECT_0) { CloseHandle(hThread); hThread = NULL; } else { // thread is still running return JSValue::Undefined(); } } if (args.size() < 1 || !args[0].IsString()) { // TODO: log this and exit return JSValue::Undefined(); } channelName = ToString(args[0].ToString()); serverName = channelName + ".jtvirc.com"; port = 6667; if (args.size() >= 2) { if (!(args[1].IsString())) { // log error return JSValue::Undefined(); } serverName = ToString(args[1].ToString()); } if (args.size() == 3) { if (!args[2].IsInteger()) { // log error return JSValue::Undefined(); } port = (unsigned int)args[2].ToInteger(); } isJoinedChannel = false; hThread = (HANDLE)_beginthreadex(NULL, 0, &IrcThread, this, 0, NULL); return JSValue::Undefined(); } else if (functionName == "disconnect") { // disconnect() if (args.size() != 0) { // TODO: log invalid method call return JSValue::Undefined(); } irc_disconnect(session); if (hThread) { WaitForSingleObject( hThread, INFINITE ); CloseHandle(hThread); hThread = NULL; } isJoinedChannel = false; moderators.clear(); latestMessage.Clear(); EnterCriticalSection(&messageLock); messages.clear(); LeaveCriticalSection(&messageLock); return JSValue::Undefined(); } else if (functionName == "getMessages") { // [message, message, ..] getMessages() EnterCriticalSection(&messageLock); if (args.size() != 0) { // TODO: log invalid method call return JSValue::Undefined(); } JSArray returnArgs; while(messages.size()) { IrcMessage &message = messages[0]; JSObject newMessageObject; newMessageObject.SetProperty(WSLit("nickname"), ToWebString(message.username)); newMessageObject.SetProperty(WSLit("message"), ToWebString(message.message)); newMessageObject.SetProperty(WSLit("color"), ToWebString(message.color)); JSArray groups; for(auto i = message.groups.begin(); i != message.groups.end(); i++) { groups.Push(ToWebString(*i)); } newMessageObject.SetProperty(WSLit("groups"), groups); JSArray emoticons; for(auto i = message.emoticons.begin(); i != message.emoticons.end(); i++) { groups.Push(ToWebString(*i)); } newMessageObject.SetProperty(WSLit("emoticons"), emoticons); returnArgs.Push(newMessageObject); messages.erase(messages.begin()); } LeaveCriticalSection(&messageLock); return returnArgs; } else if (functionName == "isConnected") { return JSValue(irc_is_connected(session) && isJoinedChannel); } return JSValue::Undefined(); }