From f1d23e78a74cf093cbc9f1ce24e33ac644de6952 Mon Sep 17 00:00:00 2001 From: Kienan Stewart Date: Mon, 20 Apr 2020 01:42:52 -0400 Subject: [PATCH] Add sway tracker to negotiations --- negotiation.py | 79 +++++++++++++++++++- static/css/style.css | 47 ++++++++++++ static/images/active-market.png | Bin 0 -> 13358 bytes static/images/active-taker.png | Bin 0 -> 6344 bytes static/images/drag.png | Bin 0 -> 14048 bytes templates/negotiation.html | 65 +++++++++++++++- templates/partials/negotiation-panel.html | 4 +- templates/partials/negotiation-sidebar.html | 3 +- templates/partials/swaytracker.html | 53 +++++++++++++ 9 files changed, 247 insertions(+), 4 deletions(-) create mode 100644 static/images/active-market.png create mode 100644 static/images/active-taker.png create mode 100644 static/images/drag.png create mode 100644 templates/partials/swaytracker.html diff --git a/negotiation.py b/negotiation.py index d974833..22cc1ca 100755 --- a/negotiation.py +++ b/negotiation.py @@ -108,14 +108,36 @@ def handle_join_negotiation(json): json['room'], len(participants))) flask_socketio.emit('participants changed', {'participants': participants}, room = json['room']) - return True + # Update the user's negotation state with what is stored on the server + nego = get_negotiation(json['room']) + return nego.to_dict() def get_room_participants(room): + if '/' not in socketio.server.manager.get_namespaces(): + return [] sessions = [s for s in socketio.server.manager.get_participants('/', room)] participants = [p for s,p in session_map.items() if s in sessions] app.logger.debug(participants) return participants +@socketio.on('update negotiation') +@pony.orm.db_session +def handle_update_negotiation(json): + r = flask.Response() + app.logger.info('Received update request: {}'.format(json)) + uid, user = get_uid(r) + nego = get_negotiation(json['room']) + app.logger.info('Room owner is {}'.format(nego.owner.uid)) + if nego.owner.uid != uid: + # Refuse the update from non-owners + app.logger.warning('Refusing update of {} from non-owner {}'.format(json['room'], uid)) + return False + del json['room'] + nego.set(**json) + pony.orm.commit() + flask_socketio.emit('negotiation updated', {**json}, room = nego.name) + return True + @socketio.on('leave negotiation') def handle_leave_disconnect(json): r = flask.Response() @@ -186,9 +208,64 @@ if __name__ == '__main__': uid = pony.orm.Required(str) display_name = pony.orm.Optional(str) negotiations = pony.orm.Set('Negotiation') + + # Negotiations have a state. Maybe storing a state machine object (pickle?) + # would be an idea. But maybe not. + # + # Let's start with understanding negotiations + # 1. Prep Work: Before a negotiation begins, each take may do Prep Work + # 2. The takers decide who their Lead Negotiator will be. Once set, this + # cannot be changed. + # 3. The Lead Negotiation makes a First Impression + # This is a leadership check which has four effects: + # 1. The number of rounds of negotiation: max(floor(black+ld/2), 5) + # 2. The starting position (crit success +1 sway, crit failure: -1 sway) + # 3. Whether or not the negotiation length is known to takers. T/F based + # simple succes. + # 4. Who leads the negotiations (starting round): takers on success, Market otherwise. + # 4. Negotiation Round(s) + # 1. Lead negotiator plays a negotiation tactic + # 2. Other negotiator plays a negotiation tactic + # 3. Check negotiation end condition + # 4. If not ended, a non-negotiator taker may play scam + # 5. Wrap-up + # 1. Taker negotiator rolls Leadership. Success moves up to meet Market, + # failure moves market down to meet takers. + # 2a. Takers may accept the deal. + # 2b. Takers may back out. Next negotiation starts on lowest tracker, has + # no prep work, scams, or will. + # 3. Competition undercuts. If able, the competition will undercut by one + # spot on the way tracker. _Any_ taker may make a CHA check to stop this, + # but on failure the takers must lower theire price to match the competition. + # class Negotiation(db.Entity): name = pony.orm.PrimaryKey(str) owner = pony.orm.Required(User) + client_name = pony.orm.Optional(str) + negotiatior_name = pony.orm.Optional(str) + taker_crew_name = pony.orm.Optional(str) + # Manual negotation + manual_negotiation = pony.orm.Optional(bool) + # Pre-negotiation details + takers = pony.orm.Optional(int) + lead_negotiator = pony.orm.Optional(str) + is_first_negotiation = pony.orm.Optional(bool) + first_impression_black = pony.orm.Optional(int) + # One of critfail, fail, success, critsuccess + first_impression_state = pony.orm.Optional(str) + negotiation_round = pony.orm.Optional(int) + # One of leadnego, secondnego, scam + negotiation_phase = pony.orm.Optional(str) + taker_sway = pony.orm.Optional(int) + market_sway = pony.orm.Optional(int) + # If negotiation_round = (calculed length) && negotiation_phase = scam then + # the negotiation is no into the wrap up section + # One of critfail, fail, success, critsuccess + wrapup_state = pony.orm.Optional(int) + job_accepted = pony.orm.Optional(bool) + may_be_undercut = pony.orm.Optional(bool) + undercut = pony.orm.Optional(bool) + db.bind(**app.config['PONY']) db.generate_mapping(create_tables=True) Pony(app) diff --git a/static/css/style.css b/static/css/style.css index 8e78d54..1fa3d78 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -964,6 +964,53 @@ img { margin: 0; float: right; } + +.negotiation-wrapper { + display: flex; +} + +.negotiation-sidebar { + max-width: 30%; +} + +.negotiation-panel { + min-width: 70%; +} + +/* maybe this should be grids */ +.swaytracker .slot { + min-height: 50px; + min-width: 150px; + max-width: 13%; + border: 1px solid; +} + +.swaytracker th { + color: #600000; + background: white; + border-color: black; +} + +.swaytracker .market-position .active { + height: 50px; + background-image: url("/static/images/active-market.png"); + background-repeat: no-repeat; + background-position: center; +} +.swaytracker .taker-position .active { + height: 50px; + background-image: url("/static/images/active-taker.png"); + background-repeat: no-repeat; + background-position: center; +} +.swaytracker .slot span { + font-weight: bold; +} + +.swaytracker .slot p { + margin: 0.5em; +} + #wrapper { position: relative; padding-right: 0; diff --git a/static/images/active-market.png b/static/images/active-market.png new file mode 100644 index 0000000000000000000000000000000000000000..c05e066d62be21ca2962e8485636a066dab4b138 GIT binary patch literal 13358 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 { + $('.swaytracker .active').on('dragstart', swayslot_on_dragstart); + $('.swaytracker .active').attr('draggable', true); + $('.swaytracker .market-position .slot').on('dragover', swayslot_on_dragover); + $('.swaytracker .taker-position .slot').on('dragover', swayslot_on_dragover); + $('.swaytracker .market-position .slot').on('drop', swayslot_on_drop); + $('.swaytracker .taker-position .slot').on('drop', swayslot_on_drop); + }); {% endblock content %} diff --git a/templates/partials/negotiation-panel.html b/templates/partials/negotiation-panel.html index ad7c3fb..2010786 100644 --- a/templates/partials/negotiation-panel.html +++ b/templates/partials/negotiation-panel.html @@ -1 +1,3 @@ -@TODO Panel +

diff --git a/templates/partials/negotiation-sidebar.html b/templates/partials/negotiation-sidebar.html index 1f252d0..8eb65d9 100644 --- a/templates/partials/negotiation-sidebar.html +++ b/templates/partials/negotiation-sidebar.html @@ -1,10 +1,11 @@
-

Negotiation {{negotiation.name}} is being run by {{room_owner_display_name}}

+

The Market for this negotiation is {{room_owner_display_name}}

{% if room_owner_display_name == uid %}

Change your display name

{% endif %}
+{% if

Participants

diff --git a/templates/partials/swaytracker.html b/templates/partials/swaytracker.html new file mode 100644 index 0000000..1d11837 --- /dev/null +++ b/templates/partials/swaytracker.html @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Market
+ As a favour +

Contract is offered at the Demand price only and the client (market) earns a "- Rep" spot to use in future negotiations.

+
+ Buyer's Market +

Contract is offered at the Demand price only.

+
+ At Value +

Contract is offered at the value of Supply and Demand

+
+ Labour +

Client agrees to add the Crew's "Break Point" in bounty to the value of Supply and Demand

+
+ Hazard Pay +

Add one bounty per leg per taker to the value of the contract

+
+ 100% Markup +

Double the cost of the Supply and Demand for the job

+
+ Expenses +

The upkeep of items is factored into the value of the contract. Takers pay no upkeep this session.

+
Takers