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 |
|
---|