code: def run(self, *args, **kwargs):
          
          async def runner():
              try:
                  await self.start(*args, **kwargs)
              finally:
                  await self.close()
  
          try:
              self.loop.run_until_complete(runner())
          except KeyboardInterrupt:
              log.info('Received signal to terminate bot and event loop.')
          finally:
              log.info('Cleaning up tasks.')
              _cleanup_loop(self.loop)
docs: A blocking call that abstracts away the event loop
          initialisation from you.
  
          If you want more control over the event loop then this
          function should not be used. Use :meth:`start` coroutine
          or :meth:`connect` + :meth:`login`.
  
          Roughly Equivalent to: ::
  
              try:
                  loop.run_until_complete(start(*args, **kwargs))
              except KeyboardInterrupt:
                  loop.run_until_complete(logout())
                  # cancel all tasks lingering
              finally:
                  loop.close()
  
          .. warning::
  
              This function must be the last function to call due to the fact that it
              is blocking. That means that registration of events or anything being
              called after this function call will not execute until it returns.