<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def sync(self, since=None, timeout_ms=30000, filter=None, full_state=None, set_presence=None):
 """ Perform a sync request. Args: since (str):
 Optional. A token which specifies where to continue a sync from. timeout_ms (int):
 Optional. The time in milliseconds to wait. filter (int|str):
 Either a Filter ID or a JSON string. full_state (bool):
 Return the full state for every room the user has joined Defaults to false. set_presence (str):
 Should the client be marked as "online" or" offline" """


        request = {
            # non-integer timeouts appear to cause issues
            "timeout": int(timeout_ms)
        }

        if since:
            request["since"] = since

        if filter:
            request["filter"] = filter

        if full_state:
            request["full_state"] = json.dumps(full_state)

        if set_presence:
            request["set_presence"] = set_presence

        return self._send("GET", "/sync", query_params=request,
                          api_path=MATRIX_V2_API_PATH)