Exemple #1
0
 def spawn(self):
     """Sends the ``spawn`` command."""
     yield from self.connected.wait()
     rawnick = self.nick.encode('utf-8')
     msg = struct.pack("<B" + ("H" * len(rawnick)),
                       0, *rawnick)
     yield from self.ws.send(msg)
     logger.debug("Spawn sent.")
Exemple #2
0
 def toggle_fullscreen(self):
     if self.fullscreen:
         logger.debug("Fullscreen OFF")
         self.create_window()
         sdl2.SDL_SetWindowSize(self.window.window,
                                self.window_w,
                                self.window_h)
         self.fullscreen = False
     else:
         logger.debug("Fullscreen ON")
         sdl2.SDL_SetWindowFullscreen(
             self.window.window,
             sdl2.SDL_WINDOW_FULLSCREEN)
         self.fullscreen = True
Exemple #3
0
    def create_party(self):
        """Create a new party."""
        logger.info("Creating a new party.")
        region = b":".join((self.region.encode('ascii'), b"party"))
        data = b"\n".join((region, INIT_TOKEN.encode('ascii')))
        res = requests.post('https://m.agar.io/',
                            data=data,
                            headers={'Origin': 'http://agar.io',
                                     'User-Agent': USER_AGENT,
                                     'Referer': 'http://agar.io/'})

        self.server, self.token, _ = res.text.split('\n')
        logger.debug("Server: %s", self.server)
        logger.info("Party Token: %s", self.token)
Exemple #4
0
    def connect(self):
        """Connects to the server."""
        if self.server is None:
            self.get_server()

        logger.info("Connecting to server %s", self.server)
        self.ws = yield from websockets.connect("ws://" + self.server,
                                                origin='http://agar.io')
        yield from self.ws.send(struct.pack("<BI", 254, PROTO_VERSION))
        yield from self.ws.send(struct.pack("<BI", 255, int(INIT_TOKEN)))

        # Send token
        msg = struct.pack("B" + ("B" * len(self.token)),
                          80, *[ord(c) for c in self.token])

        yield from self.ws.send(msg)
        logger.debug("Connected!")
        self.connected.set()
Exemple #5
0
 def get_capabilities(self):
     asrt(sdl2.SDL_GetRendererInfo(self.renderer, self.renderer_info))
     logger.debug("Renderer max texture size: %dx%d",
                  self.renderer_info.max_texture_width,
                  self.renderer_info.max_texture_height)
     flags = "|".join(filter(None,
         (('SDL_RENDERER_SOFTWARE'
           if sdl2.SDL_RENDERER_SOFTWARE & self.renderer_info.flags
           else ''),
          ('SDL_RENDERER_ACCELERATED'
           if sdl2.SDL_RENDERER_ACCELERATED & self.renderer_info.flags
           else ''),
          ('SDL_RENDERER_PRESENTVSYNC'
           if sdl2.SDL_RENDERER_PRESENTVSYNC & self.renderer_info.flags
           else ''),
          ('SDL_RENDERER_TARGETTEXTURE'
           if sdl2.SDL_RENDERER_TARGETTEXTURE & self.renderer_info.flags
           else ''))))
     logger.debug("Renderer capabilities: %s", flags)
Exemple #6
0
    def get_server(self):
        """Requests a new server and token."""
        if not self.party:
            url = 'https://m.agar.io/'
            data = b"\n".join((self.region.encode('ascii'),
                               INIT_TOKEN.encode('ascii')))
        else:
            url = 'https://m.agar.io/getToken'
            data = self.party.encode("ascii")

        res = requests.post(url,
                            data=data,
                            headers={'Origin': 'http://agar.io',
                                     'User-Agent': USER_AGENT,
                                     'Referer': 'http://agar.io/'})

        if not self.party:
            self.server, self.token, _ = res.text.split('\n')
        else:
            self.server = res.text.strip('\n')
            self.token = self.party
        logger.debug("Server: %s", self.server)
        logger.debug("Token: %s", self.token)
Exemple #7
0
 def run(self):
     """Logs all everything."""
     while True:
         data = yield from self.messages.get()
         logger.debug(data)
Exemple #8
0
    def run(self):
        sdl2.ext.init()
        sdlttf.TTF_Init()
        self.get_screen_size()

        for i in range(5, 10):
            size = 2**i
            self.font[size] = sdlttf.TTF_OpenFont(
                FONT_PATH.encode('ascii'),
                size)

        self.last = time.monotonic()

        self.create_window()

        # Window creation, we wait for a ScreenAndCamera message.
        while True:
            data = yield from self.messages.get()
            if isinstance(data, ScreenAndCamera):
                self.gamescreen = data.screen
                self.camera = Camera(data.camera.x, data.camera.y, 0.085)
                break

        # Play
        while True:
            try:
                data = yield from asyncio.wait_for(self.messages.get(),
                                                   1 / self.ref_rate)
            except asyncio.TimeoutError:
                data = None

            if isinstance(data, PlayerCell):
                self.player_id = data.cell.id
            elif isinstance(data, CameraPosition):
                self.camera = data.camera
            elif isinstance(data, Leaderboard):
                self.update_leaderboard(data)
            elif isinstance(data, Status):
                for cell in data.cells:
                    self.players[cell.id] = cell
                    if cell.name:
                        self.names[cell.id] = cell.name
                for cell in data.dissapears:
                    if cell.id in self.players:
                        del self.players[cell.id]
                for eats in data.eat:
                    if eats.eatee == self.player_id:
                        self.player_id = None
                    if eats.eatee in self.players:
                        del self.players[eats.eatee]

            # Read sdl events
            for event in sdl2.ext.get_events():
                if event.type == sdl2.SDL_QUIT:
                    logger.debug("QUIT event received.")
                    return
                elif event.type == sdl2.SDL_WINDOWEVENT:
                    if event.window.event == sdl2.SDL_WINDOWEVENT_RESIZED:
                        self.window_w = event.window.data1
                        self.window_h = event.window.data2
                        logger.debug("Window resized %dx%d",
                                     event.window.data1,
                                     event.window.data2)
                elif event.type == sdl2.SDL_KEYDOWN:
                    if event.key.keysym.sym == sdl2.SDLK_f:
                        self.toggle_fullscreen()
                    elif event.key.keysym.sym == sdl2.SDLK_ESCAPE:
                        if self.fullscreen:
                            self.toggle_fullscreen()
                        else:
                            logger.debug("User pressed ESC, exiting.")
                            return
                elif event.type == sdl2.SDL_MOUSEWHEEL:
                    self.user_zoom += event.wheel.y
                    if self.user_zoom > 50:
                        self.user_zoom = 50
                    elif self.user_zoom < -50:
                        self.user_zoom = -50
                    else:
                        logger.debug("UserZoom: %r", self.user_zoom)
                if not self.view_only:
                    if event.type == sdl2.SDL_KEYDOWN:
                        if event.key.keysym.sym == sdl2.SDLK_SPACE:
                            logger.debug("SPACE key pressed.")
                            asyncio.async(self.client.split())
                        elif event.key.keysym.sym == sdl2.SDLK_w:
                            logger.debug("W key pressed.")
                            asyncio.async(self.client.eject())
                    elif event.type == sdl2.SDL_MOUSEMOTION:
                        self.mouse_x = event.motion.x
                        self.mouse_y = event.motion.y
                        self.move = self.tr_win2game_coords(self.mouse_x,
                                                            self.mouse_y)
                    elif (event.type == sdl2.SDL_MOUSEBUTTONDOWN and
                          event.button.button == sdl2.SDL_BUTTON_LEFT):
                        logger.debug("Mouse button pressed.")
                        asyncio.async(self.client.spawn())

            self.now = time.monotonic()

            if self.move is not None:
                if self.move != self.last_move:
                    asyncio.async(self.client.move(*self.move))
                    self.last_move = self.move
                    self.last_move_send = self.now
                elif self.now - self.last_move_send > 0.05:
                    self.move = self.tr_win2game_coords(self.mouse_x,
                                                        self.mouse_y)
                    if self.move:
                        asyncio.async(self.client.move(*self.move))
                        self.last_move = self.move
                        self.last_move_send = self.now

            delay = abs(self.last - self.now)
            if self.messages.empty() and delay > 1 / self.ref_rate:
                self.refresh()
                self.last = self.now
Exemple #9
0
 def spectate(self):
     """Initiates the spectator mode."""
     yield from self.connected.wait()
     yield from asyncio.sleep(2)
     yield from self.ws.send(struct.pack("B", 1))
     logger.debug("Spectate sent.")
Exemple #10
0
 def move(self, x, y):
     """Sends the ``movement`` command."""
     yield from self.connected.wait()
     yield from self.ws.send(struct.pack("<BddI", 16, x, y, 0))
     logger.debug("Move sent (x=%s, y=%s)", x, y)
Exemple #11
0
 def eject(self):
     """Sends the ``mass eject`` command."""
     yield from self.connected.wait()
     msg = struct.pack("<B", 21)
     yield from self.ws.send(msg)
     logger.debug("Eject sent.")
Exemple #12
0
 def split(self):
     """Sends the ``split cell`` command."""
     yield from self.connected.wait()
     msg = struct.pack("<B", 17)
     yield from self.ws.send(msg)
     logger.debug("Split sent.")