diff --git a/lib/tapatalker.rb b/lib/tapatalker.rb index 1786a4b..e9f2969 100644 --- a/lib/tapatalker.rb +++ b/lib/tapatalker.rb @@ -5,6 +5,8 @@ require 'json' require 'pp' require 'chronic' +PUSH_TYPES = "ann,conv,pm,sub,like,thank,quote,newtopic,tag" + CONFIG = YAML.load( File.read( File.join( @@ -33,13 +35,20 @@ set :tapatalk_api_key, CONFIG.fetch( 'tapatalk_api_key', nil ) before do # Pass through all cookies to the discourse instance discourse( request.cookies ) + + # TODO: Override on auth failures, cookie timeouts, etc. to set this to false + mobiquo_login_header!( request.cookies.has_key?("_t") ) end helpers do + def mobiquo_login_header!( val ) + headers "Mobiquo_is_login" => val.to_s + end + # Use this as our entry point def dispatch - xml = @request.body.read + xml = fixup_tapatalk_xml( @request.body.read ) fixup_tapatalk_xml( xml ) @@ -50,7 +59,7 @@ helpers do method = "xmlrpc_#{method.gsub(/([A-Z])/, '_ ').downcase}" puts "method = #{method}, args = #{ method =~ /login/ ? "*REDACTED*" : arguments.inspect }" - + # Check if method exists if(respond_to?(method)) content_type("text/xml", :charset => "utf-8") @@ -64,7 +73,8 @@ helpers do # Apparently, tapatalk formats booleans contrary to the XMLRPC standard. # https://github.com/svdgraaf/django-tapatalk/blob/master/tapatalk/dispatcher.py def fixup_tapatalk_xml( text ) - text.gsub( 'true', '1' ) + text.gsub( 'true', '1' ). + gsub( 'false', '0' ) end def make_xmlrpc_datetime( string ) @@ -157,7 +167,12 @@ helpers do end def respond_xmlrpc( rsp ) - XMLRPC::Marshal.dump_response( rsp ) + data = XMLRPC::Marshal.dump_response( rsp ) + + data.gsub!( '', '' ) + data.tr!("\n", "") + + data end ## http://tapatalk.com/api/api_section.php ## @@ -166,6 +181,7 @@ helpers do # First function called by tapatalk, apparently we should always return the # whole hash. def xmlrpc_get_config( name = nil ) + mobiquo_login_header!( false ) result = { # Uncontroversial @@ -202,7 +218,7 @@ helpers do "min_search_length" => 3, # Boring default "alert" => "0", # TODO "direct_unsubscribe" => "0", # TODO - # "push_type" => "ann,conv,pm,sub,like,thank,quote,newtopic,tag", + # "push_type" => PUSH_TYPES, # "ban_delete_type" => "none", # TODO "inappreg" => "0", # TODO @@ -261,7 +277,7 @@ helpers do end def xmlrpc_login( user = nil, pass = nil, anonymous = false, push = '1' ) - + mobiquo_login_header!( false ) return respond_xmlrpc( 'result' => false, 'result_text' => binary_xmlrpc( 'Anonymous login not supported' ) @@ -307,7 +323,10 @@ helpers do # can_whosonline => true, # api level 4 # can_profile => true, # api level 4 'can_upload_avatar' => false, # TODO - # push_type ... + + # Don't enable push if the user has disabled it + # FIXME: bool or string 1/0 ? + # 'push_type' => PUSH_TYPES.split(",").collect {|type| { 'name' => type, 'value' => push } } ) end @@ -342,7 +361,15 @@ helpers do 'new_post' => true, # TODO "is_protected" => false, # Not required, apparently 'description' => binary_xmlrpc( hsh['description'].to_s ), - "child" => [] + "child" => [], + + # These are returned by some others + 'new_post' => false, + 'url' => '', + 'logo_url' => '', + 'unread_count' => 0, # TODO + + } # FIXME: may not be right?