Example #1
0
    def __init__(self, userdata):
        self.nickname = userdata.nickname
        self.tag = userdata.tag
        self.gender = userdata.gender
        self.height = userdata.height
        self.baseheight = userdata.baseheight
        self.viewscale = userdata.viewscale
        self.scale = userdata.scale
        self.formattedscale = userdata.getFormattedScale(verbose=True)
        self.baseweight = userdata.baseweight
        self.weight = userdata.weight
        self.formattedweightscale = userdata.getFormattedScale(
            scaletype="weight", verbose=True)

        self.averageheightmult = self.height / defaultheight
        self.averageweightmult = self.weight / defaultweight

        if userdata.hairlength is None:
            self.hairlength = None
        else:
            self.hairlength = SV(userdata.hairlength / self.viewscale)

        if userdata.taillength is None:
            self.taillength = None
        else:
            self.taillength = SV(userdata.taillength / self.viewscale)

        if userdata.footlength is None:
            self.footlength = SV(self.height * self.footfactor)
        else:
            self.footlength = SV(userdata.footlength / self.viewscale)
        self.shoesize = formatShoeSize(self.footlength, self.gender == "f")
        self.footwidth = SV(self.height * self.footwidthfactor)
        self.toeheight = SV(self.height * self.toeheightfactor)
        self.shoeprintdepth = SV(self.height * self.toeheightfactor)
        self.pointerlength = SV(self.height * self.pointerfactor)
        self.thumbwidth = SV(self.height * self.thumbfactor)
        self.fingerprintdepth = SV(self.height * self.fingerprintfactor)

        defaultthreadthickness = SV.parse("1.016mm")
        self.threadthickness = SV(defaultthreadthickness *
                                  self.averageheightmult)

        self.hairwidth = SV(self.height * self.hairfactor)
        self.nailthickness = SV(self.height * self.nailthickfactor)
        self.eyewidth = SV(self.height * self.eyewidthfactor)

        self.avgheightcomp = SV(defaultheight * self.viewscale)
        self.avgweightcomp = WV(defaultweight * self.viewscale**3)

        viewangle = calcViewAngle(self.height, defaultheight)
        self.avglookangle = abs(viewangle)
        self.avglookdirection = "up" if viewangle >= 0 else "down"

        defaultwalkspeed = SV.parse("2.5mi")
        defaultrunspeed = SV.parse("7.5mi")

        self.walkperhour = SV(defaultwalkspeed * self.averageheightmult)
        self.runperhour = SV(defaultrunspeed * self.averageheightmult)
Example #2
0
def WV_format():
    value = Decimal(request.args.get("value"))
    system = request.args.get("system")
    try:
        val = WV(value)
    except InvalidSizeValue:
        abort(404)
    return json.dumps({"formatted": format(val, system)})
Example #3
0
    async def setstrength(self, ctx, *, newstrength):
        """Set your current lift/carry strength."""

        userdata = userdb.load(ctx.guild.id, ctx.author.id, allow_unreg=True)

        userdata.liftstrength = WV(
            WV.parse(newstrength) * (userdata.viewscale**3))
        userdb.save(userdata)

        await ctx.send(
            f"{userdata.nickname}'s base lift strength is now {userdata.liftstrength:mu} long, "
            f"or {SV(userdata.liftstrength):mu} currently.")
        await showNextStep(ctx, userdata)
Example #4
0
    async def setweight(self, ctx, *, newweight):
        """Set your current weight."""
        userdata = userdb.load(ctx.guild.id, ctx.author.id)

        userdata.baseweight = WV(WV.parse(newweight) * (userdata.viewscale**3))
        userdb.save(userdata)

        logger.info(
            f"User {ctx.author.id} ({ctx.author.display_name}) changed their weight to {newweight}."
        )
        await ctx.send(
            f"<@{ctx.author.id}>'s weight is now {userdata.weight:mu}")

        await proportions.nickUpdate(ctx.author)
Example #5
0
    def __init__(self,
                 name,
                 dimension,
                 aliases=[],
                 symbol=None,
                 height=None,
                 length=None,
                 width=None,
                 diameter=None,
                 depth=None,
                 thickness=None,
                 weight=None):

        self.name = name
        self.namePlural = getPlural(name)
        self.singularNames = aliases + [self.name]
        self.aliases = aliases + [getPlural(a) for a in aliases]
        self.article = getIndefiniteArticle(self.name).split(" ")[0]
        self.symbol = symbol or None

        self.height = height and SV(height)
        self.length = length and SV(length)
        self.width = width and SV(width)
        self.diameter = diameter and SV(diameter)
        self.depth = depth and SV(depth)
        self.thickness = thickness and SV(thickness)
        self.weight = weight and WV(weight)

        dimensionmap = {
            "h": "height",
            "l": "length",
            "w": "width",
            "d": "diameter",
            "p": "depth",
            "t": "thickness"
        }

        self.unitlength = getattr(self, dimensionmap[dimension])
Example #6
0
 def weight(self):
     return WV(self.baseweight * (self.scale**3))
Example #7
0
 def baseweight(self, value):
     value = WV(value)
     if value < 0:
         value = WV(0)
     self._baseweight = value
Example #8
0
from functools import total_ordering
import importlib.resources as pkg_resources
from typing import Literal

import arrow

import sizebot.data
from sizebot.lib import errors, paths
from sizebot.lib.decimal import Decimal
from sizebot.lib.diff import Diff, Rate as ParseableRate
from sizebot.lib.units import SV, WV
from sizebot.lib.utils import isURL, truncate

# Defaults
defaultheight = SV("1.754")  # meters
defaultweight = WV("66760")  # grams
defaultterminalvelocity = SV("63.63")  # meters/second
falllimit = SV("7.73")  # meters/second
defaultliftstrength = WV("18143.7")  # grams

modelJSON = json.loads(pkg_resources.read_text(sizebot.data, "models.json"))


@total_ordering
class User:
    # __slots__ declares to python what attributes to expect.
    __slots__ = [
        "guildid", "id", "nickname", "lastactive", "_picture_url",
        "description", "_gender", "display", "_height", "_baseheight",
        "_baseweight", "_footlength", "_pawtoggle", "_furtoggle",
        "_hairlength", "_taillength", "_earheight", "_liftstrength",
Example #9
0
    def __init__(self, userdata):
        self.nickname = userdata.nickname
        self.tag = userdata.tag
        self.gender = userdata.autogender
        self.height = userdata.height
        self.baseheight = userdata.baseheight
        self.viewscale = userdata.viewscale
        self.scale = userdata.scale
        self.formattedscale = userdata.getFormattedScale(verbose=True)
        self.baseweight = userdata.baseweight
        self.weight = userdata.weight
        self.formattedweightscale = userdata.getFormattedScale(
            scaletype="weight", verbose=True)
        self.footname = userdata.footname
        self.hairname = userdata.hairname
        self.pawtoggle = userdata.pawtoggle
        self.furtoggle = userdata.furtoggle
        self.macrovision_model = userdata.macrovision_model
        self.macrovision_view = userdata.macrovision_view

        self.averageheightmult = self.height / defaultheight
        self.averageweightmult = self.weight / defaultweight

        if userdata.hairlength is None:
            self.hairlength = None
        else:
            self.hairlength = SV(userdata.hairlength / self.viewscale)

        if userdata.taillength is None:
            self.taillength = None
        else:
            self.taillength = SV(userdata.taillength / self.viewscale)

        if userdata.earheight is None:
            self.earheight = None
        else:
            self.earheight = SV(userdata.earheight / self.viewscale)

        if userdata.liftstrength is None:
            self.liftstrength = WV(defaultliftstrength / (self.viewscale**3))
        else:
            self.liftstrength = WV(userdata.liftstrength / (self.viewscale**3))

        if userdata.footlength is None:
            self.footlength = SV(self.height * self.footfactor)
        else:
            self.footlength = SV(userdata.footlength / self.viewscale)
        self.shoesize = formatShoeSize(self.footlength, self.gender == "f")
        self.footwidth = SV(self.height * self.footwidthfactor)
        self.toeheight = SV(self.height * self.toeheightfactor)
        self.shoeprintdepth = SV(self.height * self.toeheightfactor)
        self.pointerlength = SV(self.height * self.pointerfactor)
        self.thumbwidth = SV(self.height * self.thumbfactor)
        self.fingerprintdepth = SV(self.height * self.fingerprintfactor)

        self.threadthickness = SV(self.defaultthreadthickness *
                                  self.averageheightmult)

        self.hairwidth = SV(
            (self.baseheight * self.hairfactor) / self.viewscale)
        self.nailthickness = SV(
            (self.baseheight * self.nailthickfactor) / self.viewscale)
        self.eyewidth = SV(self.height * self.eyewidthfactor)

        self.avgheightcomp = SV(defaultheight * self.viewscale)
        self.avgweightcomp = WV(defaultweight * self.viewscale**3)

        viewangle = calcViewAngle(self.height, defaultheight)
        self.avglookangle = abs(viewangle)
        self.avglookdirection = "up" if viewangle >= 0 else "down"

        if userdata.walkperhour is None:
            self.walkperhour = SV(self.defaultwalkspeed *
                                  self.averageheightmult)
        else:
            self.walkperhour = SV(userdata.walkperhour *
                                  self.averageheightmult)

        if userdata.runperhour is None:
            self.runperhour = SV(self.defaultrunspeed * self.averageheightmult)
        else:
            self.runperhour = SV(userdata.runperhour * self.averageheightmult)

        self.walksteplength = SV(self.walkperhour / self.walkstepsperhour)
        self.runsteplength = SV(self.runperhour / self.runstepsperhour)

        self.horizondistance = SV(
            math.sqrt(math.pow(self.height + 6378137, 2) - 40680631590769))

        self.terminalvelocity = SV(defaultterminalvelocity *
                                   Decimal(math.sqrt(self.scale)))
        self.fallproof = self.terminalvelocity < falllimit
        self.fallproofcheck = emojis.voteyes if self.fallproof else emojis.voteno
def test_negative_WV_parse():
    result = WV.parse("-12kg")
    assert result == WV("-12000")
Example #11
0
 def baseweight(self, value):
     self._baseweight = WV(max(0, WV(value)))
Example #12
0
import json
from copy import copy
from functools import total_ordering
from typing import Literal

from sizebot import conf
from sizebot.lib import errors
from sizebot.lib.units import SV, WV

# Defaults
defaultheight = SV("1.754")  # meters
defaultweight = WV("66760")  # grams

# Map the deprecated user array constants to the new names
# TODO: This is used never, I think?
#                      NICK        DISP       CHEI      BHEI          BWEI          UNIT          SPEC
DEPRECATED_NAME_MAP = [
    "nickname", "display", "height", "baseheight", "baseweight", "unitsystem",
    "species"
]


@total_ordering
class User:
    # __slots__ declares to python what attributes to expect.
    __slots__ = [
        "guildid", "id", "nickname", "_gender", "display", "_height",
        "_baseheight", "_baseweight", "_footlength", "_hairlength",
        "_taillength", "_unitsystem", "species"
    ]