[73] | 1 | from abc import ABC, abstractmethod
|
---|
| 2 | from typing import TypeVar, Generic, List
|
---|
| 3 | from geniusweb.connection.Connectable import Connectable
|
---|
| 4 | from geniusweb.party.Capabilities import Capabilities
|
---|
| 5 | from geniusweb.inform.Inform import Inform
|
---|
| 6 | from geniusweb.actions.Action import Action
|
---|
| 7 |
|
---|
| 8 |
|
---|
| 9 | class Party (Connectable[Inform, Action] ):
|
---|
| 10 | '''
|
---|
| 11 | This is a interface definition for java-based party implementations that are
|
---|
| 12 | to be run on the PartiesServer.
|
---|
| 13 |
|
---|
| 14 | To implement a party to run on the PartiesServer, you must implement this and
|
---|
| 15 | also have a 0-arg constructor. Also we strongly recommend not to use any
|
---|
| 16 | static code blocks or do anything serious in the constructor. Instances of
|
---|
| 17 | your class may also be created only to call the getCapabilities function.
|
---|
| 18 |
|
---|
| 19 | <h2>Short outline</h2> After the party is created (empty constructor) it is
|
---|
| 20 | first connected through a call to connect (from the {@link Connectable}
|
---|
| 21 | interface). The party can subscribe to receive {@link Inform} objects using
|
---|
| 22 | {@link ConnectionEnd#addListener(tudelft.utilities.listener.Listener)}. The
|
---|
| 23 | party can also send its actions using {@link ConnectionEnd#send(Object)}.
|
---|
| 24 |
|
---|
| 25 | The {@link ConnectionEnd} allows the party to receive Inform objects and send
|
---|
| 26 | action objects.
|
---|
| 27 |
|
---|
| 28 | Incoming Inform objects (eg "Settings" containing the profile, and
|
---|
| 29 | "yourturn") are notified to the party throught he notifyChange() call to the
|
---|
| 30 | party.
|
---|
| 31 | <p>
|
---|
| 32 | Outgoing Action objects (eg "Offer") are sent using the send() command.
|
---|
| 33 |
|
---|
| 34 | Most parties extend {@link DefaultParty} to handle these connection details.
|
---|
| 35 | <p>
|
---|
| 36 | Technical details: normally a Party will be spawned inside a PartiesFactory,
|
---|
| 37 | and incoming/outgoing calls are routed through a websocket there. But in
|
---|
| 38 | testing the Connectable is often mocked.
|
---|
| 39 | '''
|
---|
| 40 |
|
---|
| 41 | @abstractmethod
|
---|
| 42 | def getCapabilities(self) -> Capabilities:
|
---|
| 43 | '''
|
---|
| 44 | @return the capabilities of this party.
|
---|
| 45 | '''
|
---|
| 46 |
|
---|
| 47 | @abstractmethod
|
---|
| 48 | def getDescription(self) -> str:
|
---|
| 49 | '''
|
---|
| 50 | @return some useful short description, eg "tit-for-tat with bayesian
|
---|
| 51 | opponent modeling".
|
---|
| 52 | '''
|
---|
| 53 |
|
---|
| 54 | @abstractmethod
|
---|
| 55 | def terminate(self):
|
---|
| 56 | '''
|
---|
| 57 | When this is called, the party should free up its resources and terminate
|
---|
| 58 | its threads. This call may come in at any time, eg when a negotiation is
|
---|
| 59 | aborted.
|
---|
| 60 | '''
|
---|
| 61 |
|
---|