code: def set_entry(self, jid, *,
                    name=_Sentinel,
                    add_to_groups=frozenset(),
                    remove_from_groups=frozenset(),
                    timeout=None):
          
  
          existing = self.items.get(jid, Item(jid))
  
          post_groups = (existing.groups | add_to_groups) - remove_from_groups
          post_name = existing.name
          if name is not _Sentinel:
              post_name = name
  
          item = roster_xso.Item(
              jid=jid,
              name=post_name,
              groups=[
                  roster_xso.Group(name=group_name)
                  for group_name in post_groups
              ])
  
          yield from self.client.send(
              stanza.IQ(
                  structs.IQType.SET,
                  payload=roster_xso.Query(items=[
                      item
                  ])
              ),
              timeout=timeout
          )
docs: Set properties of a roster entry or add a new roster entry. The roster
          entry is identified by its bare `jid`.
  
          If an entry already exists, all values default to those stored in the
          existing entry. For example, if no `name` is given, the current name of
          the entry is re-used, if any.
  
          If the entry does not exist, it will be created on the server side.
  
          The `remove_from_groups` and `add_to_groups` arguments have to be based
          on the locally cached state, as XMPP does not support sending
          diffs. `remove_from_groups` takes precedence over `add_to_groups`.
  
          `timeout` is the time in seconds to wait for a confirmation by the
          server.
  
          Note that the changes may not be visible immediately after his
          coroutine returns in the :attr:`items` and :attr:`groups`
          attributes. The :class:`Service` waits for the "official" roster push
          from the server for updating the data structures and firing events, to
          ensure that consistent state with other clients is achieved.
  
          This may raise arbitrary :class:`.errors.XMPPError` exceptions if the
          server replies with an error and also any kind of connection error if
          the connection gets fatally terminated while waiting for a response.