【问题标题】:How to get username from discord Hikari Python如何从不和谐的 Hikari Python 中获取用户名
【发布时间】:2022-09-29 14:36:25
【问题描述】:

如何在 discord.py 中获得像 bot.get_user(id) 这样的不和谐用户名? 我正在使用 hikari,做一个服务器中所有用户的 JSON 列表,我有他们的 ID,但没有用户名,我希望它定期更新。

def retrieveUsernames():
  consoleLog(color.blue,\"do get usernames\") # log in console
  guild = \"xxxx\"
  jsonItem = cc.getJson() #get json object
  for key in creamCoin[guild]:


    user = # GET USER OBJECT FROM ID


    name = user.username
    name = bot.rest.get_user(int(key))
    print(key)
    print(name)
    #key acts as user
    jsonItem[guild][key][\"username\"] = name #update plain text username
  cc.updateJSONDatabase() #commit changes

    标签: python discord bots


    【解决方案1】:

    Hikari 的 API 调用是异步的,因此您必须:(1)在 async 函数中使用 await 调用它们或(2)使用 asyncio 从非异步函数调用它们,但它也需要 hikari 的事件循环。 Hikari 的所有事件都是异步函数,因此您可以在 API 函数之前使用 await 来调用它。如果您想在触发事件之外进行定期调用,我建议使用单独的线程或 APScheduler 之类的东西来启动 Cron 样式的服务。

    import hikari
    import asyncio
    import threading
    
    bot = hikari.GatewayBot(token='...')
    
    @bot.listen(hikari.StartedEvent)
    async def on_bot_started(event):
        user = await bot.rest.fetch_user(SOME_USER_ID)
        print(f'Main thread: {user.username}')
    
        # retrieve usernames in a separate thread
        loop = asyncio.get_running_loop()
        threading.Thread(target=retrieve_usernames, args=[loop, user.id]).start()
    
    def retrieve_usernames(loop: asyncio.AbstractEventLoop, user_id: hikari.Snowflake):
        call_async(asyncio.sleep(1), loop)
        user = call_async(bot.rest.fetch_user(user_id), loop)
        print(f'Separate thread: {user.username}')
    
    def call_async(coro, loop):
        return asyncio.run_coroutine_threadsafe(coro, loop).result()
    
    bot.run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-09
      • 2017-12-07
      • 2019-05-31
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2019-04-14
      • 2017-09-18
      相关资源
      最近更新 更多