dota2 icon indicating copy to clipboard operation
dota2 copied to clipboard

Cannot process emited events while being hosting as Flask/FastAPI app

Open akhlebka opened this issue 2 years ago • 2 comments

I have an issue with creating a small web application whuch will wait for request with profile id and return it's profile card, but it seems like jobs and events are not working when hosting it as Flask or FastAPI apps. For me it seems like a bug but I'm not sure. Do you have ideas?

from steam.client import SteamClient
from dota2.client import Dota2Client
from flask import Flask, Response


logging.basicConfig(
    format='[%(asctime)s] %(levelname)s %(name)s: %(message)s', level=logging.DEBUG)

username = "login"
password = "password"

app = Flask(__name__)
steamClient = SteamClient()
dota = Dota2Client(steamClient)


@dota.on('ready')
def fetch_profile_card():
    logging.info('Logged in to Dota 2')
    pass


@dota.on('profile_card')
def print_profile_card(account_id, profile_card):
    if profile_card:
        logging.log("Got the profile card")


# @app.get("/getPlayerProfile/{playerId}") # use this for FaskAPI
@app.route('/getPlayerProfile/<int:playerId>', methods=['GET'])
def getUserProfile(playerId):
    logging.log(logging.INFO, 'Got GETUSERPROFILE event with %d player ID' % int(playerId))
    # we hardcode here so you can send everything you want it will try to obtain profile card from tutorial
    jobid = dota.request_profile_card(70388657)
    profile_card = dota.wait_msg(jobid, timeout=10)
    if profile_card:
        return Response(status=200, response='event emited and got profile card')
    else:
        return Response(status=404, response='event emited and got no profile card')

try:
    if dota.ready is not True:
        steamClient.login(username, password, login_id=774)
        dota.launch()
        dota.wait_event('ready')
    app.run()
except KeyboardInterrupt:
    steamClient.logout()

akhlebka avatar May 28 '23 09:05 akhlebka

See this example: https://github.com/ValvePython/steam/tree/master/recipes/2.SimpleWebAPI

I would also make sure the credentials for login are always used as remember password tends to disconnect once in a while. Monkey patching is recommended (you have to do that yourself, see https://steam.readthedocs.io/en/latest/api/steam.monkey.html#steam.monkey.patch_minimal). I would also recommend using https://www.gevent.org/api/gevent.pywsgi.html#gevent.pywsgi.WSGIServer to run the flask app. Can't comment on fastapi as I haven't tried it.

rossengeorgiev avatar May 29 '23 11:05 rossengeorgiev

@rossengeorgiev thanks for the answer. It was really helpful. But I'm also not sure what's the idea of set_credential_location() method. It does not create any file in my file system or even if I create cm_servers.json file myself (because this is the only files related error I see in logs) SteamClient does not override it Where can I find any info about how this file works or how should I fill it to ex. not pass login and password everytime and just use client.login()?

akhlebka avatar May 29 '23 17:05 akhlebka