split app and models; improve roll_dices; add requirements.txt
This commit is contained in:
		
							parent
							
								
									d9237b2891
								
							
						
					
					
						commit
						366a340b1d
					
				
							
								
								
									
										46
									
								
								app.py
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								app.py
									
									
									
									
									
								
							@ -1,5 +1,7 @@
 | 
				
			|||||||
from flask import Flask
 | 
					from flask import Flask
 | 
				
			||||||
from flask_restx import Api, Resource, fields
 | 
					from flask_restx import Api, Resource, fields
 | 
				
			||||||
 | 
					from marshmallow import Schema, fields, validate
 | 
				
			||||||
 | 
					from models import dice_model, ability_model, hp_model
 | 
				
			||||||
import random
 | 
					import random
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app = Flask(__name__)
 | 
					app = Flask(__name__)
 | 
				
			||||||
@ -11,20 +13,18 @@ dice = api.namespace('dice', description='Dice operations')
 | 
				
			|||||||
ability = api.namespace('ability', description='Ability operations')
 | 
					ability = api.namespace('ability', description='Ability operations')
 | 
				
			||||||
hp = api.namespace('hp', description='HP operations')
 | 
					hp = api.namespace('hp', description='HP operations')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dice_model = dice.model('Dice', {
 | 
					dice_model = dice.model('Dice', dice_model)
 | 
				
			||||||
    'quantity': fields.Integer(required=True, description='The number of dice to roll'),
 | 
					ability_model = ability.model('Ability', ability_model)
 | 
				
			||||||
    'geometry': fields.Integer(required=True, description='The number of sides on each die'),
 | 
					hp_model = hp.model('HP', hp_model)
 | 
				
			||||||
    'discard_lowest': fields.Boolean(required=False, default=False, description='Drop the lowest score')
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ability_model = ability.model('Ability', {
 | 
					 | 
				
			||||||
    'chartype': fields.String(required=False, default="human", description='Character type')
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
hp_model = hp.model('HP', {
 | 
					class DiceSchema(Schema):
 | 
				
			||||||
    'chartype': fields.String(required=False, default="human", description='Character type'),
 | 
					    quantity = fields.Int(required=True, validate=validate.Range(min=1), description='The number of dice to roll')
 | 
				
			||||||
    'conscore': fields.Integer(required=True, description='Conscore')
 | 
					    geometry = fields.Int(required=True, validate=validate.Range(min=2), description='The number of sides on each die')
 | 
				
			||||||
})
 | 
					    discard_lowest = fields.Bool(default=False, description='Drop the lowest score')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dice_schema = DiceSchema()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@api.route('/roll/dice', methods=['POST'])
 | 
					@api.route('/roll/dice', methods=['POST'])
 | 
				
			||||||
@ -32,6 +32,9 @@ class RollDice(Resource):
 | 
				
			|||||||
    @dice.expect(dice_model)
 | 
					    @dice.expect(dice_model)
 | 
				
			||||||
    def post(self):
 | 
					    def post(self):
 | 
				
			||||||
        data = api.payload
 | 
					        data = api.payload
 | 
				
			||||||
 | 
					        errors = dice_schema.validate(data)
 | 
				
			||||||
 | 
					        if errors:
 | 
				
			||||||
 | 
					            return errors, 400
 | 
				
			||||||
        quantity = data.get('quantity')
 | 
					        quantity = data.get('quantity')
 | 
				
			||||||
        geometry = data.get('geometry')
 | 
					        geometry = data.get('geometry')
 | 
				
			||||||
        discard_lowest = data.get('discard_lowest')
 | 
					        discard_lowest = data.get('discard_lowest')
 | 
				
			||||||
@ -83,16 +86,31 @@ class RollToHit(Resource):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def roll_dices(dice_count, dice_sides, discard_lowest):
 | 
					def roll_dices(dice_count, dice_sides, discard_lowest):
 | 
				
			||||||
    roll_results = []
 | 
					    roll_results = []
 | 
				
			||||||
 | 
					    discarded = []
 | 
				
			||||||
    for _ in range(dice_count):
 | 
					    for _ in range(dice_count):
 | 
				
			||||||
        roll_results.append(random.randint(1, dice_sides))
 | 
					        roll_results.append(random.randint(1, dice_sides))
 | 
				
			||||||
    if discard_lowest and len(roll_results) > 0:
 | 
					    if discard_lowest and len(roll_results) > 0:
 | 
				
			||||||
 | 
					        discarded.append(min(roll_results))
 | 
				
			||||||
        roll_results.remove(min(roll_results))
 | 
					        roll_results.remove(min(roll_results))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if discarded:
 | 
				
			||||||
 | 
					        net_dice_count = dice_count -1
 | 
				
			||||||
 | 
					        mnemonic = str(dice_count)+"(-1)d"+str(dice_sides)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        mnemonic = str(dice_count)+'d'+str(dice_sides)
 | 
				
			||||||
 | 
					        net_dice_count = dice_count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    result = {
 | 
					    result = {
 | 
				
			||||||
        'die-set': {'quantity': dice_count, 'geometry': dice_sides},
 | 
					        'dice-set': {
 | 
				
			||||||
 | 
					            'mnemonic': mnemonic,
 | 
				
			||||||
 | 
					            'min-roll': net_dice_count,
 | 
				
			||||||
 | 
					            'max-roll': dice_sides*net_dice_count
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        'rolls': roll_results,
 | 
					        'rolls': roll_results,
 | 
				
			||||||
        'sum': sum(roll_results)
 | 
					        'result': sum(roll_results)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if discarded:
 | 
				
			||||||
 | 
					        result['discarded'] = discarded
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return result
 | 
					    return result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										23
									
								
								models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								models.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					from flask_restx import fields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Common fields
 | 
				
			||||||
 | 
					chartype_field = fields.String(required=False, default="human", description='Character type. Allowed values: "human", '
 | 
				
			||||||
 | 
					                                                                            '"mutant", "android", "robot"')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Dice model
 | 
				
			||||||
 | 
					dice_model = {
 | 
				
			||||||
 | 
					    'quantity': fields.Integer(required=True, description='The number of dice to roll'),
 | 
				
			||||||
 | 
					    'geometry': fields.Integer(required=True, description='The number of sides on each die'),
 | 
				
			||||||
 | 
					    'discard_lowest': fields.Boolean(required=False, default=False, description='Drop the lowest score')
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ability model
 | 
				
			||||||
 | 
					ability_model = {
 | 
				
			||||||
 | 
					    'chartype': chartype_field
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Hp model
 | 
				
			||||||
 | 
					hp_model = {
 | 
				
			||||||
 | 
					    'chartype': chartype_field,
 | 
				
			||||||
 | 
					    'conscore': fields.Integer(required=True, description='Conscore')
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										3
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					Flask~=3.0.3
 | 
				
			||||||
 | 
					flask-restx~=1.3.0
 | 
				
			||||||
 | 
					marshmallow~=3.21.3
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user