Best Python code snippet using localstack_python
config.js
Source:config.js  
1import {ClassFeatures} from "./classFeatures.js"2// Namespace Configuration Values3export const SNS = {};4// ASCII Artwork5SNS.ASCII = `_______________________________6______      ______ _____ _____7|  _  \\___  |  _  \\  ___|  ___|8| | | ( _ ) | | | |___ \\| |__9| | | / _ \\/\\ | | |   \\ \\  __|10| |/ / (_>  < |/ //\\__/ / |___11|___/ \\___/\\/___/ \\____/\\____/12_______________________________`;13/**14 * The set of Ability Scores used within the system15 * @type {Object}16 */17SNS.abilities = {18  "str": "SNS.AbilityStr",19  "dex": "SNS.AbilityDex",20  "con": "SNS.AbilityCon",21  "int": "SNS.AbilityInt",22  "wis": "SNS.AbilityWis",23  "cha": "SNS.AbilityCha"24};25SNS.abilityAbbreviations = {26  "str": "SNS.AbilityStrAbbr",27  "dex": "SNS.AbilityDexAbbr",28  "con": "SNS.AbilityConAbbr",29  "int": "SNS.AbilityIntAbbr",30  "wis": "SNS.AbilityWisAbbr",31  "cha": "SNS.AbilityChaAbbr"32};33/* -------------------------------------------- */34/**35 * Character alignment options36 * @type {Object}37 */38SNS.alignments = {39  'lg': "SNS.AlignmentLG",40  'ng': "SNS.AlignmentNG",41  'cg': "SNS.AlignmentCG",42  'ln': "SNS.AlignmentLN",43  'tn': "SNS.AlignmentTN",44  'cn': "SNS.AlignmentCN",45  'le': "SNS.AlignmentLE",46  'ne': "SNS.AlignmentNE",47  'ce': "SNS.AlignmentCE"48};49/* -------------------------------------------- */50/**51 * An enumeration of item attunement types52 * @enum {number}53 */54SNS.attunementTypes = {55  NONE: 0,56  REQUIRED: 1,57  ATTUNED: 2,58}59/**60 * An enumeration of item attunement states61 * @type {{"0": string, "1": string, "2": string}}62 */63SNS.attunements = {64  0: "SNS.AttunementNone",65  1: "SNS.AttunementRequired",66  2: "SNS.AttunementAttuned"67};68/* -------------------------------------------- */69SNS.weaponProficiencies = {70  "sim": "SNS.WeaponSimpleProficiency",71  "mar": "SNS.WeaponMartialProficiency"72};73/**74 * A map of weapon item proficiency to actor item proficiency75 * Used when a new player owned item is created76 * @type {Object}77 */78SNS.weaponProficienciesMap = {79  "natural": true,80  "simpleM": "sim",81  "simpleR": "sim",82  "martialM": "mar",83  "martialR": "mar"84}85/**86 * The basic weapon types in sns. This enables specific weapon proficiencies or87 * starting equipment provided by classes and backgrounds.88 *89 * @enum {string}90 */91SNS.weaponIds = {92    "battleaxe": "I0WocDSuNpGJayPb",93    "blowgun": "wNWK6yJMHG9ANqQV",94    "club": "nfIRTECQIG81CvM4",95    "dagger": "0E565kQUBmndJ1a2",96    "dart": "3rCO8MTIdPGSW6IJ",97    "flail": "UrH3sMdnUDckIHJ6",98    "glaive": "rOG1OM2ihgPjOvFW",99    "greataxe": "1Lxk6kmoRhG8qQ0u",100    "greatclub": "QRCsxkCwWNwswL9o",101    "greatsword": "xMkP8BmFzElcsMaR",102    "halberd": "DMejWAc8r8YvDPP1",103    "handaxe": "eO7Fbv5WBk5zvGOc",104    "handcrossbow": "qaSro7kFhxD6INbZ",105    "heavycrossbow": "RmP0mYRn2J7K26rX",106    "javelin": "DWLMnODrnHn8IbAG",107    "lance": "RnuxdHUAIgxccVwj",108    "lightcrossbow": "ddWvQRLmnnIS0eLF",109    "lighthammer": "XVK6TOL4sGItssAE",110    "longbow": "3cymOVja8jXbzrdT",111    "longsword": "10ZP2Bu3vnCuYMIB",112    "mace": "Ajyq6nGwF7FtLhDQ",113    "maul": "DizirD7eqjh8n95A",114    "morningstar": "dX8AxCh9o0A9CkT3",115    "net": "aEiM49V8vWpWw7rU",116    "pike": "tC0kcqZT9HHAO0PD",117    "quarterstaff": "g2dWN7PQiMRYWzyk",118    "rapier": "Tobce1hexTnDk4sV",119    "scimitar": "fbC0Mg1a73wdFbqO",120    "shortsword": "osLzOwQdPtrK3rQH",121    "sickle": "i4NeNZ30ycwPDHMx",122    "spear": "OG4nBBydvmfWYXIk",123    "shortbow": "GJv6WkD7D2J6rP6M",124    "sling": "3gynWO9sN4OLGMWD",125    "trident": "F65ANO66ckP8FDMa",126    "warpick": "2YdfjN1PIIrSHZii",127    "warhammer":  "F0Df164Xv1gWcYt0",128    "whip": "QKTyxoO0YDnAsbYe"129};130/* -------------------------------------------- */131SNS.toolProficiencies = {132  "art": "SNS.ToolArtisans",133  "disg": "SNS.ToolDisguiseKit",134  "forg": "SNS.ToolForgeryKit",135  "game": "SNS.ToolGamingSet",136  "herb": "SNS.ToolHerbalismKit",137  "music": "SNS.ToolMusicalInstrument",138  "navg": "SNS.ToolNavigators",139  "pois": "SNS.ToolPoisonersKit",140  "thief": "SNS.ToolThieves",141  "vehicle": "SNS.ToolVehicle"142};143/**144 * The basic tool types in sns. This enables specific tool proficiencies or145 * starting equipment provided by classes and backgrounds.146 *147 * @enum {string}148 */149SNS.toolIds = {150  "alchemist": "SztwZhbhZeCqyAes",151  "bagpipes": "yxHi57T5mmVt0oDr",152  "brewer": "Y9S75go1hLMXUD48",153  "calligrapher": "jhjo20QoiD5exf09",154  "card": "YwlHI3BVJapz4a3E",155  "carpenter": "8NS6MSOdXtUqD7Ib",156  "cartographer": "fC0lFK8P4RuhpfaU",157  "cobbler": "hM84pZnpCqKfi8XH",158  "cook": "Gflnp29aEv5Lc1ZM",159  "dice": "iBuTM09KD9IoM5L8",160  "disg": "IBhDAr7WkhWPYLVn",161  "drum": "69Dpr25pf4BjkHKb",162  "dulcimer": "NtdDkjmpdIMiX7I2",163  "flute": "eJOrPcAz9EcquyRQ",164  "forg": "cG3m4YlHfbQlLEOx",165  "glassblower": "rTbVrNcwApnuTz5E",166  "herb": "i89okN7GFTWHsvPy",167  "horn": "aa9KuBy4dst7WIW9",168  "jeweler": "YfBwELTgPFHmQdHh",169  "leatherworker": "PUMfwyVUbtyxgYbD",170  "lute": "qBydtUUIkv520DT7",171  "lyre": "EwG1EtmbgR3bM68U",172  "mason": "skUih6tBvcBbORzA",173  "navg": "YHCmjsiXxZ9UdUhU",174  "painter": "ccm5xlWhx74d6lsK",175  "panflute": "G5m5gYIx9VAUWC3J",176  "pois": "il2GNi8C0DvGLL9P",177  "potter": "hJS8yEVkqgJjwfWa",178  "shawm": "G3cqbejJpfB91VhP",179  "smith": "KndVe2insuctjIaj",180  "thief": "woWZ1sO5IUVGzo58",181  "tinker": "0d08g1i5WXnNrCNA",182  "viol": "baoe3U5BfMMMxhCU",183  "weaver": "ap9prThUB2y9lDyj",184  "woodcarver": "xKErqkLo4ASYr5EP",185};186/* -------------------------------------------- */187/**188 * This Object defines the various lengths of time which can occur189 * @type {Object}190 */191SNS.timePeriods = {192  "inst": "SNS.TimeInst",193  "turn": "SNS.TimeTurn",194  "round": "SNS.TimeRound",195  "minute": "SNS.TimeMinute",196  "hour": "SNS.TimeHour",197  "day": "SNS.TimeDay",198  "month": "SNS.TimeMonth",199  "year": "SNS.TimeYear",200  "perm": "SNS.TimePerm",201  "spec": "SNS.Special"202};203/* -------------------------------------------- */204/**205 * This describes the ways that an ability can be activated206 * @type {Object}207 */208SNS.abilityActivationTypes = {209  "none": "SNS.None",210  "action": "SNS.Action",211  "bonus": "SNS.BonusAction",212  "reaction": "SNS.Reaction",213  "minute": SNS.timePeriods.minute,214  "hour": SNS.timePeriods.hour,215  "day": SNS.timePeriods.day,216  "special": SNS.timePeriods.spec,217  "legendary": "SNS.LegAct",218  "shipact": "SNS.ShipAct",219  "lair": "SNS.LairAct",220  "crew": "SNS.VehicleCrewAction"221};222/* -------------------------------------------- */223SNS.abilityConsumptionTypes = {224  "ammo": "SNS.ConsumeAmmunition",225  "attribute": "SNS.ConsumeAttribute",226  "material": "SNS.ConsumeMaterial",227  "charges": "SNS.ConsumeCharges"228};229/* -------------------------------------------- */230// Creature Sizes231SNS.actorSizes = {232  "tiny": "SNS.SizeTiny",233  "sm": "SNS.SizeSmall",234  "med": "SNS.SizeMedium",235  "lg": "SNS.SizeLarge",236  "huge": "SNS.SizeHuge",237  "grg": "SNS.SizeGargantuan"238};239SNS.tokenSizes = {240  "tiny": 0.6,241  "sm": 0.8,242  "med": 1,243  "lg": 2,244  "huge": 3,245  "grg": 4246};247/**248 * Colors used to visualize temporary and temporary maximum HP in token health bars249 * @enum {number}250 */251SNS.tokenHPColors = {252  temp: 0x66CCFF,253  tempmax: 0x440066,254  negmax: 0x550000255}256/* -------------------------------------------- */257/**258 * Creature types259 * @type {Object}260 */261SNS.creatureTypes = {262  "aberration": "SNS.CreatureAberration",263  "beast": "SNS.CreatureBeast",264  "celestial": "SNS.CreatureCelestial",265  "construct": "SNS.CreatureConstruct",266  "dragon": "SNS.CreatureDragon",267  "elemental": "SNS.CreatureElemental",268  "fey": "SNS.CreatureFey",269  "fiend": "SNS.CreatureFiend",270  "giant": "SNS.CreatureGiant",271  "humanoid": "SNS.CreatureHumanoid",272  "monstrosity": "SNS.CreatureMonstrosity",273  "ooze": "SNS.CreatureOoze",274  "plant": "SNS.CreaturePlant",275  "undead": "SNS.CreatureUndead"276};277/* -------------------------------------------- */278/* -------------------------------------------- */279// Vehicle Classifications280SNS.actorVehicleClasses = {281  "terClass": "SNS.VehicleClassificationTerrestrial",282  "shipClass": "SNS.VehicleClassificationSpaceship"283};284/* -------------------------------------------- */285/**286 * Classification types for item action types287 * @type {Object}288 */289SNS.itemActionTypes = {290  "mwak": "SNS.ActionMWAK",291  "rwak": "SNS.ActionRWAK",292  "msak": "SNS.ActionMSAK",293  "rsak": "SNS.ActionRSAK",294  "save": "SNS.ActionSave",295  "heal": "SNS.ActionHeal",296  "abil": "SNS.ActionAbil",297  "util": "SNS.ActionUtil",298  "other": "SNS.ActionOther"299};300/* -------------------------------------------- */301SNS.itemCapacityTypes = {302  "items": "SNS.ItemContainerCapacityItems",303  "weight": "SNS.ItemContainerCapacityWeight"304};305/* -------------------------------------------- */306/**307 * Enumerate the lengths of time over which an item can have limited use ability308 * @type {Object}309 */310SNS.limitedUsePeriods = {311  "sr": "SNS.ShortRest",312  "lr": "SNS.LongRest",313  "day": "SNS.Day",314  "charges": "SNS.Charges"315};316/* -------------------------------------------- */317/**318 * The set of equipment types for armor, clothing, and other objects which can ber worn by the character319 * @type {Object}320 */321SNS.equipmentTypes = {322  "light": "SNS.EquipmentLight",323  "medium": "SNS.EquipmentMedium",324  "heavy": "SNS.EquipmentHeavy",325  "bonus": "SNS.EquipmentBonus",326  "natural": "SNS.EquipmentNatural",327  "shield": "SNS.EquipmentShield",328  "clothing": "SNS.EquipmentClothing",329  "modification": "SNS.EquipmentModification",330  "cyberware": "SNS.EquipmentCyberware",331  "bioware": "SNS.EquipmentBioware",332  "mageware": "SNS.EquipmentMageware",333  "computer": "SNS.EquipmentComputer",334  "software": "SNS.EquipmentSoftware",335  "trinket": "SNS.EquipmentTrinket",336  "vehicle": "SNS.EquipmentVehicle"337};338/* -------------------------------------------- */339/**340 * The set of Armor Proficiencies which a character may have341 * @type {Object}342 */343SNS.armorProficiencies = {344  "lgt": SNS.equipmentTypes.light,345  "med": SNS.equipmentTypes.medium,346  "hvy": SNS.equipmentTypes.heavy,347  "shl": "SNS.EquipmentShieldProficiency"348};349/**350 * A map of armor item proficiency to actor item proficiency351 * Used when a new player owned item is created352 * @type {Object}353 */354SNS.armorProficienciesMap = {355  "natural": true,356  "clothing": true,357  "light": "lgt",358  "medium": "med",359  "heavy": "hvy",360  "shield": "shl"361}362/* -------------------------------------------- */363/**364 * Enumerate the valid consumable types which are recognized by the system365 * @type {Object}366 */367SNS.consumableTypes = {368  "ammo": "SNS.ConsumableAmmunition",369  "explosive": "SNS.ConsumableExplosive",370  "potion": "SNS.ConsumablePotion",371  "poison": "SNS.ConsumablePoison",372  "drug": "SNS.ConsumableDrug",373  "food": "SNS.ConsumableFood",374  "scroll": "SNS.ConsumableScroll",375  "wand": "SNS.ConsumableWand",376  "rod": "SNS.ConsumableRod",377  "trinket": "SNS.ConsumableTrinket"378};379/* -------------------------------------------- */380/**381 * The valid currency denominations supported by the SnS system382 * @type {Object}383 */384SNS.currencies = {385  "gp": "SNS.CurrencyGP",386  "cc": "SNS.CurrencyCC"387};388/* -------------------------------------------- */389// Damage Types390SNS.damageTypes = {391  "acid": "SNS.DamageAcid",392  "ballistic": "SNS.DamageBallistic",393  "bludgeoning": "SNS.DamageBludgeoning",394  "cold": "SNS.DamageCold",395  "fire": "SNS.DamageFire",396  "force": "SNS.DamageForce",397  "lightning": "SNS.DamageLightning",398  "necrotic": "SNS.DamageNecrotic",399  "piercing": "SNS.DamagePiercing",400  "plasma": "SNS.DamagePlasma",401  "poison": "SNS.DamagePoison",402  "psychic": "SNS.DamagePsychic",403  "radiant": "SNS.DamageRadiant",404  "slashing": "SNS.DamageSlashing",405  "thunder": "SNS.DamageThunder"406};407// Damage Resistance Types408SNS.damageResistanceTypes = mergeObject(foundry.utils.deepClone(SNS.damageTypes), {409  "physical": "SNS.DamagePhysical"410});411/* -------------------------------------------- */412/**413 * The valid units of measure for movement distances in the game system.414 * By default this uses the imperial units of feet and miles.415 * @type {Object<string,string>}416 */417SNS.movementTypes = {418  "burrow": "SNS.MovementBurrow",419  "climb": "SNS.MovementClimb",420  "fly": "SNS.MovementFly",421  "swim": "SNS.MovementSwim",422  "zerog": "SNS.MovementZeroG",423  "walk": "SNS.MovementWalk",424  "maxspeed": "SNS.MovementMaxSpeed",425  "mph": "SNS.MovementMPH",426}427/**428 * The valid units of measure for movement distances in the game system.429 * By default this uses the imperial units of feet and miles.430 * @type {Object<string,string>}431 */432SNS.movementUnits = {433  "ft": "SNS.DistFt",434  "mi": "SNS.DistMi",435  "arc": "SNS.DistArc"436}437/**438 * The valid units of measure for the range of an action or effect.439 * This object automatically includes the movement units from SNS.movementUnits440 * @type {Object<string,string>}441 */442SNS.distanceUnits = {443  "none": "SNS.None",444  "self": "SNS.DistSelf",445  "touch": "SNS.DistTouch",446  "spec": "SNS.Special",447  "any": "SNS.DistAny"448};449for ( let [k, v] of Object.entries(SNS.movementUnits) ) {450  SNS.distanceUnits[k] = v;451}452/* -------------------------------------------- */453/**454 * Configure aspects of encumbrance calculation so that it could be configured by modules455 * @type {Object}456 */457SNS.encumbrance = {458  currencyPerWeight: 1000000000,459  strMultiplier: 15,460  vehicleWeightMultiplier: 2000 // 2000 lbs in a ton461};462/* -------------------------------------------- */463/**464 * This Object defines the types of single or area targets which can be applied465 * @type {Object}466 */467SNS.targetTypes = {468  "none": "SNS.None",469  "self": "SNS.TargetSelf",470  "creature": "SNS.TargetCreature",471  "ally": "SNS.TargetAlly",472  "enemy": "SNS.TargetEnemy",473  "object": "SNS.TargetObject",474  "space": "SNS.TargetSpace",475  "radius": "SNS.TargetRadius",476  "sphere": "SNS.TargetSphere",477  "cylinder": "SNS.TargetCylinder",478  "cone": "SNS.TargetCone",479  "square": "SNS.TargetSquare",480  "cube": "SNS.TargetCube",481  "line": "SNS.TargetLine",482  "wall": "SNS.TargetWall"483};484/* -------------------------------------------- */485/**486 * Map the subset of target types which produce a template area of effect487 * The keys are SNS target types and the values are MeasuredTemplate shape types488 * @type {Object}489 */490SNS.areaTargetTypes = {491  cone: "cone",492  cube: "rect",493  cylinder: "circle",494  line: "ray",495  radius: "circle",496  sphere: "circle",497  square: "rect",498  wall: "ray"499};500/* -------------------------------------------- */501// Healing Types502SNS.healingTypes = {503  "healing": "SNS.Healing",504  "temphp": "SNS.HealingTemp"505};506/* -------------------------------------------- */507/**508 * Enumerate the denominations of hit dice which can apply to classes509 * @type {Array.<string>}510 */511SNS.hitDieTypes = ["d6", "d8", "d10", "d12"];512/* -------------------------------------------- */513/**514 * The set of possible sensory perception types which an Actor may have515 * @type {object}516 */517SNS.senses = {518  "blindsight": "SNS.SenseBlindsight",519  "darkvision": "SNS.SenseDarkvision",520  "ultraviolet": "SNS.SenseUltraviolet",521  "infrared": "SNS.SenseInfrared",522  "tremorsense": "SNS.SenseTremorsense",523  "truesight": "SNS.SenseTruesight"524};525/* -------------------------------------------- */526/**527 * The set of skill which can be trained528 * @type {Object}529 */530SNS.skills = {531  "acr": "SNS.SkillAcr",532  "arc": "SNS.SkillArc",533  "com": "SNS.SkillCom",534  "ath": "SNS.SkillAth",535  "dec": "SNS.SkillDec",536  "eti": "SNS.SkillEti",537  "his": "SNS.SkillHis",538  "ins": "SNS.SkillIns",539  "itm": "SNS.SkillItm",540  "inv": "SNS.SkillInv",541  "mec": "SNS.SkillMec",542  "med": "SNS.SkillMed",543  "prc": "SNS.SkillPrc",544  "per": "SNS.SkillPer",545  "pil": "SNS.SkillPil",546  "sci": "SNS.SkillSci",547  "ste": "SNS.SkillSte",548  "sur": "SNS.SkillSur"549};550/* -------------------------------------------- */551SNS.spellPreparationModes = {552  "prepared": "SNS.SpellPrepPrepared",553  "pact": "SNS.PactMagic",554  "always": "SNS.SpellPrepAlways",555  "atwill": "SNS.SpellPrepAtWill",556  "innate": "SNS.SpellPrepInnate",557  "invention": "SNS.Invention",558  "battery": "SNS.Battery"559};560SNS.spellUpcastModes = ["always", "pact", "prepared", "battery"];561SNS.spellProgression = {562  "none": "SNS.SpellNone",563  "full": "SNS.SpellProgFull",564  "half": "SNS.SpellProgHalf",565  "third": "SNS.SpellProgThird",566  "pact": "SNS.SpellProgPact",567  "artificer": "SNS.SpellProgArt",568  "psion": "SNS.SpellProgPsion",569  "battery": "SNS.SpellProgBattery"570};571/* -------------------------------------------- */572/**573 * The available choices for how spell damage scaling may be computed574 * @type {Object}575 */576SNS.spellScalingModes = {577  "none": "SNS.SpellNone",578  "cantrip": "SNS.SpellCantrip",579  "level": "SNS.SpellLevel"580};581/* -------------------------------------------- */582/**583 * Define the set of types which a weapon item can take584 * @type {Object}585 */586SNS.weaponTypes = {587  "simpleM": "SNS.WeaponSimpleM",588  "simpleR": "SNS.WeaponSimpleR",589  "martialM": "SNS.WeaponMartialM",590  "martialR": "SNS.WeaponMartialR",591  "natural": "SNS.WeaponNatural",592  "improv": "SNS.WeaponImprov",593  "siege": "SNS.WeaponSiege"594};595/* -------------------------------------------- */596/**597 * Define the set of weapon property flags which can exist on a weapon598 * @type {Object}599 */600SNS.weaponProperties = {601  "ada": "SNS.WeaponPropertiesAda",602  "aut": "SNS.WeaponPropertiesAut",603  "amm": "SNS.WeaponPropertiesAmm",604  "bul": "SNS.WeaponPropertiesBul",605  "blin": "SNS.WeaponPropertiesBlin",606  "dst": "SNS.WeaponPropertiesDst",607  "deaf": "SNS.WeaponPropertiesDeaf",608  "deto": "SNS.WeaponPropertiesDeto",609  "fin": "SNS.WeaponPropertiesFin",610  "fir": "SNS.WeaponPropertiesFir",611  "foc": "SNS.WeaponPropertiesFoc",612  "hvy": "SNS.WeaponPropertiesHvy",613  "lgt": "SNS.WeaponPropertiesLgt",614  "lod": "SNS.WeaponPropertiesLod",615  "mgc": "SNS.WeaponPropertiesMgc",616  "ram": "SNS.WeaponPropertiesRam",617  "radi": "SNS.WeaponPropertiesRadi",618  "rch": "SNS.WeaponPropertiesRch",619  "rech": "SNS.WeaponPropertiesRech",620  "rel": "SNS.WeaponPropertiesRel",621  "ret": "SNS.WeaponPropertiesRet",622  "scp": "SNS.WeaponPropertiesScp",623  "shk": "SNS.WeaponPropertiesShk",624  "sic": "SNS.WeaponPropertiesSic",625  "sil": "SNS.WeaponPropertiesSil",626  "slow": "SNS.WeaponPropertiesSlow",627  "spc": "SNS.WeaponPropertiesSpc",628  "stk": "SNS.WeaponPropertiesStk",629  "crf": "SNS.WeaponPropertiesCrf",630  "cone": "SNS.WeaponPropertiesCone",631  "thr": "SNS.WeaponPropertiesThr",632  "tmr": "SNS.WeaponPropertiesTmr",633  "two": "SNS.WeaponPropertiesTwo",634  "ver": "SNS.WeaponPropertiesVer",635  "vhc": "SNS.WeaponPropertiesVhc"636};637// Spell Components638SNS.spellComponents = {639  "V": "SNS.ComponentVerbal",640  "S": "SNS.ComponentSomatic",641  "M": "SNS.ComponentMaterial"642};643// Spell Schools644SNS.spellSchools = {645  "abj": "SNS.SchoolAbj",646  "con": "SNS.SchoolCon",647  "div": "SNS.SchoolDiv",648  "enc": "SNS.SchoolEnc",649  "evo": "SNS.SchoolEvo",650  "ill": "SNS.SchoolIll",651  "nec": "SNS.SchoolNec",652  "trs": "SNS.SchoolTrs"653};654// Spell Levels655SNS.spellLevels = {656  0: "SNS.SpellLevel0",657  1: "SNS.SpellLevel1",658  2: "SNS.SpellLevel2",659  3: "SNS.SpellLevel3",660  4: "SNS.SpellLevel4",661  5: "SNS.SpellLevel5",662  6: "SNS.SpellLevel6",663  7: "SNS.SpellLevel7",664  8: "SNS.SpellLevel8",665  9: "SNS.SpellLevel9"666};667// Spell Scroll Compendium UUIDs668SNS.spellScrollIds = {669  0: 'Compendium.sns.items.rQ6sO7HDWzqMhSI3',670  1: 'Compendium.sns.items.9GSfMg0VOA2b4uFN',671  2: 'Compendium.sns.items.XdDp6CKh9qEvPTuS',672  3: 'Compendium.sns.items.hqVKZie7x9w3Kqds',673  4: 'Compendium.sns.items.DM7hzgL836ZyUFB1',674  5: 'Compendium.sns.items.wa1VF8TXHmkrrR35',675  6: 'Compendium.sns.items.tI3rWx4bxefNCexS',676  7: 'Compendium.sns.items.mtyw4NS1s7j2EJaD',677  8: 'Compendium.sns.items.aOrinPg7yuDZEuWr',678  9: 'Compendium.sns.items.O4YbkJkLlnsgUszZ'679};680/**681 * Define the standard slot progression by character level.682 * The entries of this array represent the spell slot progression for a full spell-caster.683 * @type {Array[]}684 */685SNS.SPELL_SLOT_TABLE = [686  [2],687  [3],688  [4, 2],689  [4, 3],690  [4, 3, 2],691  [4, 3, 3],692  [4, 3, 3, 1],693  [4, 3, 3, 2],694  [4, 3, 3, 3, 1],695  [4, 3, 3, 3, 2],696  [4, 3, 3, 3, 2, 1],697  [4, 3, 3, 3, 2, 1],698  [4, 3, 3, 3, 2, 1, 1],699  [4, 3, 3, 3, 2, 1, 1],700  [4, 3, 3, 3, 2, 1, 1, 1],701  [4, 3, 3, 3, 2, 1, 1, 1],702  [4, 3, 3, 3, 2, 1, 1, 1, 1],703  [4, 3, 3, 3, 3, 1, 1, 1, 1],704  [4, 3, 3, 3, 3, 2, 1, 1, 1],705  [4, 3, 3, 3, 3, 2, 2, 1, 1]706];707/* -------------------------------------------- */708/**709 * Define the psion slot progression by character level.710 * The entries of this array represent the spell slot progression for a Psion-type spell-caster.711 * @type {Array[]}712 */713SNS.PSION_SPELL_SLOT_TABLE = [714  [2],715  [3],716  [3],717  [4, 2],718  [4, 2],719  [4, 3],720  [4, 3, 2],721  [4, 3, 2],722  [4, 3, 2],723  [4, 3, 3, 2],724  [4, 3, 3, 2],725  [4, 3, 3, 2],726  [4, 3, 3, 2, 2],727  [4, 3, 3, 3, 2],728  [4, 3, 3, 3, 2],729  [4, 3, 3, 3, 2],730  [4, 3, 3, 3, 2],731  [4, 4, 3, 3, 3],732  [4, 4, 3, 3, 3],733  [4, 4, 3, 3, 3]734];735/* -------------------------------------------- */736// Polymorph options.737SNS.polymorphSettings = {738  keepPhysical: 'SNS.PolymorphKeepPhysical',739  keepMental: 'SNS.PolymorphKeepMental',740  keepSaves: 'SNS.PolymorphKeepSaves',741  keepSkills: 'SNS.PolymorphKeepSkills',742  mergeSaves: 'SNS.PolymorphMergeSaves',743  mergeSkills: 'SNS.PolymorphMergeSkills',744  keepClass: 'SNS.PolymorphKeepClass',745  keepFeats: 'SNS.PolymorphKeepFeats',746  keepSpells: 'SNS.PolymorphKeepSpells',747  keepItems: 'SNS.PolymorphKeepItems',748  keepBio: 'SNS.PolymorphKeepBio',749  keepVision: 'SNS.PolymorphKeepVision'750};751/* -------------------------------------------- */752/**753 * Skill, ability, and tool proficiency levels754 * Each level provides a proficiency multiplier755 * @type {Object}756 */757SNS.proficiencyLevels = {758  0: "SNS.NotProficient",759  1: "SNS.Proficient",760  0.5: "SNS.HalfProficient",761  2: "SNS.Expertise"762};763/* -------------------------------------------- */764/**765 * The amount of cover provided by an object.766 * In cases where multiple pieces of cover are767 * in play, we take the highest value.768 */769SNS.cover = {770  0: 'SNS.None',771  .5: 'SNS.CoverHalf',772  .75: 'SNS.CoverThreeQuarters',773  1: 'SNS.CoverTotal'774};775/* -------------------------------------------- */776// Condition Types777SNS.conditionTypes = {778  "blinded": "SNS.ConBlinded",779  "charmed": "SNS.ConCharmed",780  "deafened": "SNS.ConDeafened",781  "diseased": "SNS.ConDiseased",782  "exhaustion": "SNS.ConExhaustion",783  "frightened": "SNS.ConFrightened",784  "grappled": "SNS.ConGrappled",785  "incapacitated": "SNS.ConIncapacitated",786  "invisible": "SNS.ConInvisible",787  "paralyzed": "SNS.ConParalyzed",788  "petrified": "SNS.ConPetrified",789  "poisoned": "SNS.ConPoisoned",790  "prone": "SNS.ConProne",791  "restrained": "SNS.ConRestrained",792  "stunned": "SNS.ConStunned",793  "unconscious": "SNS.ConUnconscious"794};795// Languages796SNS.languages = {797  "binary": "SNS.LanguagesBinary",798  "brahvish": "SNS.LanguagesBrahvish",799  "celestial": "SNS.LanguagesCelestial",800  "domosian": "SNS.LanguagesDomosian",801  "eezonese": "SNS.LanguagesEezonese",802  "eldritch": "SNS.LanguagesEldritch",803  "galactic": "SNS.LanguagesGalactic",804  "galacticsign": "SNS.LanguagesGalacticSign",805  "glabraunish": "SNS.LanguagesGlabraunish",806  "hanadarian": "SNS.LanguagesHanadarian",807  "infernal": "SNS.LanguagesInfernal",808  "ixian": "SNS.LanguagesIxian",809  "kygoran": "SNS.LanguagesKygoran",810  "luminescentsign": "SNS.LanguagesLuminescentSign",811  "maeshar": "SNS.LanguagesMaeshar",812  "moiccaran": "SNS.LanguagesMoiccaran",813  "olaran": "SNS.LanguagesOlaran",814  "piranthese": "SNS.LanguagesPiranthese",815  "primordial": "SNS.LanguagesPrimordial",816  "sylvan": "SNS.LanguagesSylvan",817  "cant": "SNS.LanguagesThievesCant",818  "veeruxian": "SNS.LanguagesVeeruxian",819  "vresnish": "SNS.LanguagesVresnish"820};821// Character Level XP Requirements822SNS.CHARACTER_EXP_LEVELS =  [823  0, 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000, 85000, 100000,824  120000, 140000, 165000, 195000, 225000, 265000, 305000, 355000]825;826// Challenge Rating XP Levels827SNS.CR_EXP_LEVELS = [828  10, 200, 450, 700, 1100, 1800, 2300, 2900, 3900, 5000, 5900, 7200, 8400, 10000, 11500, 13000, 15000, 18000,829  20000, 22000, 25000, 33000, 41000, 50000, 62000, 75000, 90000, 105000, 120000, 135000, 155000830];831// Tier XP Levels832SNS.TIER_EXP_LEVELS = [833  10, 1100, 3900, 8400, 15000, 25000, 62000, 93000834];835// Character Features Per Class And Level836SNS.classFeatures = ClassFeatures;837// Configure Optional Character Flags838SNS.characterFlags = {839  "diamondSoul": {840    name: "SNS.FlagsDiamondSoul",841    hint: "SNS.FlagsDiamondSoulHint",842    section: "SNS.Feats",843    type: Boolean844  },845  "elvenAccuracy": {846    name: "SNS.FlagsElvenAccuracy",847    hint: "SNS.FlagsElvenAccuracyHint",848    section: "SNS.RacialTraits",849    type: Boolean850  },851  "halflingLucky": {852    name: "SNS.FlagsHalflingLucky",853    hint: "SNS.FlagsHalflingLuckyHint",854    section: "SNS.RacialTraits",855    type: Boolean856  },857  "initiativeAdv": {858    name: "SNS.FlagsInitiativeAdv",859    hint: "SNS.FlagsInitiativeAdvHint",860    section: "SNS.Feats",861    type: Boolean862  },863  "initiativeAlert": {864    name: "SNS.FlagsAlert",865    hint: "SNS.FlagsAlertHint",866    section: "SNS.Feats",867    type: Boolean868  },869  "jackOfAllTrades": {870    name: "SNS.FlagsJOAT",871    hint: "SNS.FlagsJOATHint",872    section: "SNS.Feats",873    type: Boolean874  },875  "observantFeat": {876    name: "SNS.FlagsObservant",877    hint: "SNS.FlagsObservantHint",878    skills: ['prc','inv'],879    section: "SNS.Feats",880    type: Boolean881  },882  "powerfulBuild": {883    name: "SNS.FlagsPowerfulBuild",884    hint: "SNS.FlagsPowerfulBuildHint",885    section: "SNS.RacialTraits",886    type: Boolean887  },888  "reliableTalent": {889    name: "SNS.FlagsReliableTalent",890    hint: "SNS.FlagsReliableTalentHint",891    section: "SNS.Feats",892    type: Boolean893  },894  "remarkableAthlete": {895    name: "SNS.FlagsRemarkableAthlete",896    hint: "SNS.FlagsRemarkableAthleteHint",897    abilities: ['str','dex','con'],898    section: "SNS.Feats",899    type: Boolean900  },901  "weaponCriticalThreshold": {902    name: "SNS.FlagsWeaponCritThreshold",903    hint: "SNS.FlagsWeaponCritThresholdHint",904    section: "SNS.Feats",905    type: Number,906    placeholder: 20907  },908  "spellCriticalThreshold": {909    name: "SNS.FlagsSpellCritThreshold",910    hint: "SNS.FlagsSpellCritThresholdHint",911    section: "SNS.Feats",912    type: Number,913    placeholder: 20914  },915  "meleeCriticalDamageDice": {916    name: "SNS.FlagsMeleeCriticalDice",917    hint: "SNS.FlagsMeleeCriticalDiceHint",918    section: "SNS.Feats",919    type: Number,920    placeholder: 0921  },922};923// Configure allowed status flags...rec.py
Source:rec.py  
1#explore ux2#utf8 unicoding3from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException4from thrift.protocol.TProtocol import TProtocolException5from thrift.TRecursive import fix_spec6import sys7import logging8from .ttypes import *9from thrift.Thrift import TProcessor10from thrift.transport import TTransport11all_structs = []12class Iface(object):13    def getSnsFriends(self, snsIdType, snsAccessToken, startIdx, limit):14        """15        Parameters:16         - snsIdType17         - snsAccessToken18         - startIdx19         - limit20        """21        pass22    def getSnsMyProfile(self, snsIdType, snsAccessToken):23        """24        Parameters:25         - snsIdType26         - snsAccessToken27        """28        pass29    def postSnsInvitationMessage(self, snsIdType, snsAccessToken, toSnsUserId):30        """31        Parameters:32         - snsIdType33         - snsAccessToken34         - toSnsUserId35        """36        pass37class Client(Iface):38    def __init__(self, iprot, oprot=None):39        self._iprot = self._oprot = iprot40        if oprot is not None:41            self._oprot = oprot42        self._seqid = 043    def getSnsFriends(self, snsIdType, snsAccessToken, startIdx, limit):44        """45        Parameters:46         - snsIdType47         - snsAccessToken48         - startIdx49         - limit50        """51        self.send_getSnsFriends(snsIdType, snsAccessToken, startIdx, limit)52        return self.recv_getSnsFriends()53    def send_getSnsFriends(self, snsIdType, snsAccessToken, startIdx, limit):54        self._oprot.writeMessageBegin('getSnsFriends', TMessageType.CALL, self._seqid)55        args = getSnsFriends_args()56        args.snsIdType = snsIdType57        args.snsAccessToken = snsAccessToken58        args.startIdx = startIdx59        args.limit = limit60        args.write(self._oprot)61        self._oprot.writeMessageEnd()62        self._oprot.trans.flush()63    def recv_getSnsFriends(self):64        iprot = self._iprot65        (fname, mtype, rseqid) = iprot.readMessageBegin()66        if mtype == TMessageType.EXCEPTION:67            x = TApplicationException()68            x.read(iprot)69            iprot.readMessageEnd()70            raise x71        result = getSnsFriends_result()72        result.read(iprot)73        iprot.readMessageEnd()74        if result.success is not None:75            return result.success76        if result.e is not None:77            raise result.e78        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSnsFriends failed: unknown result")79    def getSnsMyProfile(self, snsIdType, snsAccessToken):80        """81        Parameters:82         - snsIdType83         - snsAccessToken84        """85        self.send_getSnsMyProfile(snsIdType, snsAccessToken)86        return self.recv_getSnsMyProfile()87    def send_getSnsMyProfile(self, snsIdType, snsAccessToken):88        self._oprot.writeMessageBegin('getSnsMyProfile', TMessageType.CALL, self._seqid)89        args = getSnsMyProfile_args()90        args.snsIdType = snsIdType91        args.snsAccessToken = snsAccessToken92        args.write(self._oprot)93        self._oprot.writeMessageEnd()94        self._oprot.trans.flush()95    def recv_getSnsMyProfile(self):96        iprot = self._iprot97        (fname, mtype, rseqid) = iprot.readMessageBegin()98        if mtype == TMessageType.EXCEPTION:99            x = TApplicationException()100            x.read(iprot)101            iprot.readMessageEnd()102            raise x103        result = getSnsMyProfile_result()104        result.read(iprot)105        iprot.readMessageEnd()106        if result.success is not None:107            return result.success108        if result.e is not None:109            raise result.e110        raise TApplicationException(TApplicationException.MISSING_RESULT, "getSnsMyProfile failed: unknown result")111    def postSnsInvitationMessage(self, snsIdType, snsAccessToken, toSnsUserId):112        """113        Parameters:114         - snsIdType115         - snsAccessToken116         - toSnsUserId117        """118        self.send_postSnsInvitationMessage(snsIdType, snsAccessToken, toSnsUserId)119        self.recv_postSnsInvitationMessage()120    def send_postSnsInvitationMessage(self, snsIdType, snsAccessToken, toSnsUserId):121        self._oprot.writeMessageBegin('postSnsInvitationMessage', TMessageType.CALL, self._seqid)122        args = postSnsInvitationMessage_args()123        args.snsIdType = snsIdType124        args.snsAccessToken = snsAccessToken125        args.toSnsUserId = toSnsUserId126        args.write(self._oprot)127        self._oprot.writeMessageEnd()128        self._oprot.trans.flush()129    def recv_postSnsInvitationMessage(self):130        iprot = self._iprot131        (fname, mtype, rseqid) = iprot.readMessageBegin()132        if mtype == TMessageType.EXCEPTION:133            x = TApplicationException()134            x.read(iprot)135            iprot.readMessageEnd()136            raise x137        result = postSnsInvitationMessage_result()138        result.read(iprot)139        iprot.readMessageEnd()140        if result.e is not None:141            raise result.e142        return143class Processor(Iface, TProcessor):144    def __init__(self, handler):145        self._handler = handler146        self._processMap = {}147        self._processMap["getSnsFriends"] = Processor.process_getSnsFriends148        self._processMap["getSnsMyProfile"] = Processor.process_getSnsMyProfile149        self._processMap["postSnsInvitationMessage"] = Processor.process_postSnsInvitationMessage150    def process(self, iprot, oprot):151        (name, type, seqid) = iprot.readMessageBegin()152        if name not in self._processMap:153            iprot.skip(TType.STRUCT)154            iprot.readMessageEnd()155            x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))156            oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)157            x.write(oprot)158            oprot.writeMessageEnd()159            oprot.trans.flush()160            return161        else:162            self._processMap[name](self, seqid, iprot, oprot)163        return True164    def process_getSnsFriends(self, seqid, iprot, oprot):165        args = getSnsFriends_args()166        args.read(iprot)167        iprot.readMessageEnd()168        result = getSnsFriends_result()169        try:170            result.success = self._handler.getSnsFriends(args.snsIdType, args.snsAccessToken, args.startIdx, args.limit)171            msg_type = TMessageType.REPLY172        except TTransport.TTransportException:173            raise174        except TalkException as e:175            msg_type = TMessageType.REPLY176            result.e = e177        except TApplicationException as ex:178            logging.exception('TApplication exception in handler')179            msg_type = TMessageType.EXCEPTION180            result = ex181        except Exception:182            logging.exception('Unexpected exception in handler')183            msg_type = TMessageType.EXCEPTION184            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')185        oprot.writeMessageBegin("getSnsFriends", msg_type, seqid)186        result.write(oprot)187        oprot.writeMessageEnd()188        oprot.trans.flush()189    def process_getSnsMyProfile(self, seqid, iprot, oprot):190        args = getSnsMyProfile_args()191        args.read(iprot)192        iprot.readMessageEnd()193        result = getSnsMyProfile_result()194        try:195            result.success = self._handler.getSnsMyProfile(args.snsIdType, args.snsAccessToken)196            msg_type = TMessageType.REPLY197        except TTransport.TTransportException:198            raise199        except TalkException as e:200            msg_type = TMessageType.REPLY201            result.e = e202        except TApplicationException as ex:203            logging.exception('TApplication exception in handler')204            msg_type = TMessageType.EXCEPTION205            result = ex206        except Exception:207            logging.exception('Unexpected exception in handler')208            msg_type = TMessageType.EXCEPTION209            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')210        oprot.writeMessageBegin("getSnsMyProfile", msg_type, seqid)211        result.write(oprot)212        oprot.writeMessageEnd()213        oprot.trans.flush()214    def process_postSnsInvitationMessage(self, seqid, iprot, oprot):215        args = postSnsInvitationMessage_args()216        args.read(iprot)217        iprot.readMessageEnd()218        result = postSnsInvitationMessage_result()219        try:220            self._handler.postSnsInvitationMessage(args.snsIdType, args.snsAccessToken, args.toSnsUserId)221            msg_type = TMessageType.REPLY222        except TTransport.TTransportException:223            raise224        except TalkException as e:225            msg_type = TMessageType.REPLY226            result.e = e227        except TApplicationException as ex:228            logging.exception('TApplication exception in handler')229            msg_type = TMessageType.EXCEPTION230            result = ex231        except Exception:232            logging.exception('Unexpected exception in handler')233            msg_type = TMessageType.EXCEPTION234            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')235        oprot.writeMessageBegin("postSnsInvitationMessage", msg_type, seqid)236        result.write(oprot)237        oprot.writeMessageEnd()238        oprot.trans.flush()239# HELPER FUNCTIONS AND STRUCTURES240class getSnsFriends_args(object):241    """242    Attributes:243     - snsIdType244     - snsAccessToken245     - startIdx246     - limit247    """248    def __init__(self, snsIdType=None, snsAccessToken=None, startIdx=None, limit=None,):249        self.snsIdType = snsIdType250        self.snsAccessToken = snsAccessToken251        self.startIdx = startIdx252        self.limit = limit253    def read(self, iprot):254        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:255            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])256            return257        iprot.readStructBegin()258        while True:259            (fname, ftype, fid) = iprot.readFieldBegin()260            if ftype == TType.STOP:261                break262            if fid == 2:263                if ftype == TType.I32:264                    self.snsIdType = iprot.readI32()265                else:266                    iprot.skip(ftype)267            elif fid == 3:268                if ftype == TType.STRING:269                    self.snsAccessToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()270                else:271                    iprot.skip(ftype)272            elif fid == 4:273                if ftype == TType.I32:274                    self.startIdx = iprot.readI32()275                else:276                    iprot.skip(ftype)277            elif fid == 5:278                if ftype == TType.I32:279                    self.limit = iprot.readI32()280                else:281                    iprot.skip(ftype)282            else:283                iprot.skip(ftype)284            iprot.readFieldEnd()285        iprot.readStructEnd()286    def write(self, oprot):287        if oprot._fast_encode is not None and self.thrift_spec is not None:288            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))289            return290        oprot.writeStructBegin('getSnsFriends_args')291        if self.snsIdType is not None:292            oprot.writeFieldBegin('snsIdType', TType.I32, 2)293            oprot.writeI32(self.snsIdType)294            oprot.writeFieldEnd()295        if self.snsAccessToken is not None:296            oprot.writeFieldBegin('snsAccessToken', TType.STRING, 3)297            oprot.writeString(self.snsAccessToken.encode('utf-8') if sys.version_info[0] == 2 else self.snsAccessToken)298            oprot.writeFieldEnd()299        if self.startIdx is not None:300            oprot.writeFieldBegin('startIdx', TType.I32, 4)301            oprot.writeI32(self.startIdx)302            oprot.writeFieldEnd()303        if self.limit is not None:304            oprot.writeFieldBegin('limit', TType.I32, 5)305            oprot.writeI32(self.limit)306            oprot.writeFieldEnd()307        oprot.writeFieldStop()308        oprot.writeStructEnd()309    def validate(self):310        return311    def __repr__(self):312        L = ['%s=%r' % (key, value)313             for key, value in self.__dict__.items()]314        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))315    def __eq__(self, other):316        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__317    def __ne__(self, other):318        return not (self == other)319all_structs.append(getSnsFriends_args)320getSnsFriends_args.thrift_spec = (321    None,  # 0322    None,  # 1323    (2, TType.I32, 'snsIdType', None, None, ),  # 2324    (3, TType.STRING, 'snsAccessToken', 'UTF8', None, ),  # 3325    (4, TType.I32, 'startIdx', None, None, ),  # 4326    (5, TType.I32, 'limit', None, None, ),  # 5327)328class getSnsFriends_result(object):329    """330    Attributes:331     - success332     - e333    """334    def __init__(self, success=None, e=None,):335        self.success = success336        self.e = e337    def read(self, iprot):338        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:339            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])340            return341        iprot.readStructBegin()342        while True:343            (fname, ftype, fid) = iprot.readFieldBegin()344            if ftype == TType.STOP:345                break346            if fid == 0:347                if ftype == TType.STRUCT:348                    self.success = SnsFriends()349                    self.success.read(iprot)350                else:351                    iprot.skip(ftype)352            elif fid == 1:353                if ftype == TType.STRUCT:354                    self.e = TalkException()355                    self.e.read(iprot)356                else:357                    iprot.skip(ftype)358            else:359                iprot.skip(ftype)360            iprot.readFieldEnd()361        iprot.readStructEnd()362    def write(self, oprot):363        if oprot._fast_encode is not None and self.thrift_spec is not None:364            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))365            return366        oprot.writeStructBegin('getSnsFriends_result')367        if self.success is not None:368            oprot.writeFieldBegin('success', TType.STRUCT, 0)369            self.success.write(oprot)370            oprot.writeFieldEnd()371        if self.e is not None:372            oprot.writeFieldBegin('e', TType.STRUCT, 1)373            self.e.write(oprot)374            oprot.writeFieldEnd()375        oprot.writeFieldStop()376        oprot.writeStructEnd()377    def validate(self):378        return379    def __repr__(self):380        L = ['%s=%r' % (key, value)381             for key, value in self.__dict__.items()]382        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))383    def __eq__(self, other):384        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__385    def __ne__(self, other):386        return not (self == other)387all_structs.append(getSnsFriends_result)388getSnsFriends_result.thrift_spec = (389    (0, TType.STRUCT, 'success', [SnsFriends, None], None, ),  # 0390    (1, TType.STRUCT, 'e', [TalkException, None], None, ),  # 1391)392class getSnsMyProfile_args(object):393    """394    Attributes:395     - snsIdType396     - snsAccessToken397    """398    def __init__(self, snsIdType=None, snsAccessToken=None,):399        self.snsIdType = snsIdType400        self.snsAccessToken = snsAccessToken401    def read(self, iprot):402        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:403            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])404            return405        iprot.readStructBegin()406        while True:407            (fname, ftype, fid) = iprot.readFieldBegin()408            if ftype == TType.STOP:409                break410            if fid == 2:411                if ftype == TType.I32:412                    self.snsIdType = iprot.readI32()413                else:414                    iprot.skip(ftype)415            elif fid == 3:416                if ftype == TType.STRING:417                    self.snsAccessToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()418                else:419                    iprot.skip(ftype)420            else:421                iprot.skip(ftype)422            iprot.readFieldEnd()423        iprot.readStructEnd()424    def write(self, oprot):425        if oprot._fast_encode is not None and self.thrift_spec is not None:426            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))427            return428        oprot.writeStructBegin('getSnsMyProfile_args')429        if self.snsIdType is not None:430            oprot.writeFieldBegin('snsIdType', TType.I32, 2)431            oprot.writeI32(self.snsIdType)432            oprot.writeFieldEnd()433        if self.snsAccessToken is not None:434            oprot.writeFieldBegin('snsAccessToken', TType.STRING, 3)435            oprot.writeString(self.snsAccessToken.encode('utf-8') if sys.version_info[0] == 2 else self.snsAccessToken)436            oprot.writeFieldEnd()437        oprot.writeFieldStop()438        oprot.writeStructEnd()439    def validate(self):440        return441    def __repr__(self):442        L = ['%s=%r' % (key, value)443             for key, value in self.__dict__.items()]444        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))445    def __eq__(self, other):446        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__447    def __ne__(self, other):448        return not (self == other)449all_structs.append(getSnsMyProfile_args)450getSnsMyProfile_args.thrift_spec = (451    None,  # 0452    None,  # 1453    (2, TType.I32, 'snsIdType', None, None, ),  # 2454    (3, TType.STRING, 'snsAccessToken', 'UTF8', None, ),  # 3455)456class getSnsMyProfile_result(object):457    """458    Attributes:459     - success460     - e461    """462    def __init__(self, success=None, e=None,):463        self.success = success464        self.e = e465    def read(self, iprot):466        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:467            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])468            return469        iprot.readStructBegin()470        while True:471            (fname, ftype, fid) = iprot.readFieldBegin()472            if ftype == TType.STOP:473                break474            if fid == 0:475                if ftype == TType.STRUCT:476                    self.success = SnsProfile()477                    self.success.read(iprot)478                else:479                    iprot.skip(ftype)480            elif fid == 1:481                if ftype == TType.STRUCT:482                    self.e = TalkException()483                    self.e.read(iprot)484                else:485                    iprot.skip(ftype)486            else:487                iprot.skip(ftype)488            iprot.readFieldEnd()489        iprot.readStructEnd()490    def write(self, oprot):491        if oprot._fast_encode is not None and self.thrift_spec is not None:492            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))493            return494        oprot.writeStructBegin('getSnsMyProfile_result')495        if self.success is not None:496            oprot.writeFieldBegin('success', TType.STRUCT, 0)497            self.success.write(oprot)498            oprot.writeFieldEnd()499        if self.e is not None:500            oprot.writeFieldBegin('e', TType.STRUCT, 1)501            self.e.write(oprot)502            oprot.writeFieldEnd()503        oprot.writeFieldStop()504        oprot.writeStructEnd()505    def validate(self):506        return507    def __repr__(self):508        L = ['%s=%r' % (key, value)509             for key, value in self.__dict__.items()]510        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))511    def __eq__(self, other):512        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__513    def __ne__(self, other):514        return not (self == other)515all_structs.append(getSnsMyProfile_result)516getSnsMyProfile_result.thrift_spec = (517    (0, TType.STRUCT, 'success', [SnsProfile, None], None, ),  # 0518    (1, TType.STRUCT, 'e', [TalkException, None], None, ),  # 1519)520class postSnsInvitationMessage_args(object):521    """522    Attributes:523     - snsIdType524     - snsAccessToken525     - toSnsUserId526    """527    def __init__(self, snsIdType=None, snsAccessToken=None, toSnsUserId=None,):528        self.snsIdType = snsIdType529        self.snsAccessToken = snsAccessToken530        self.toSnsUserId = toSnsUserId531    def read(self, iprot):532        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:533            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])534            return535        iprot.readStructBegin()536        while True:537            (fname, ftype, fid) = iprot.readFieldBegin()538            if ftype == TType.STOP:539                break540            if fid == 2:541                if ftype == TType.I32:542                    self.snsIdType = iprot.readI32()543                else:544                    iprot.skip(ftype)545            elif fid == 3:546                if ftype == TType.STRING:547                    self.snsAccessToken = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()548                else:549                    iprot.skip(ftype)550            elif fid == 4:551                if ftype == TType.STRING:552                    self.toSnsUserId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()553                else:554                    iprot.skip(ftype)555            else:556                iprot.skip(ftype)557            iprot.readFieldEnd()558        iprot.readStructEnd()559    def write(self, oprot):560        if oprot._fast_encode is not None and self.thrift_spec is not None:561            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))562            return563        oprot.writeStructBegin('postSnsInvitationMessage_args')564        if self.snsIdType is not None:565            oprot.writeFieldBegin('snsIdType', TType.I32, 2)566            oprot.writeI32(self.snsIdType)567            oprot.writeFieldEnd()568        if self.snsAccessToken is not None:569            oprot.writeFieldBegin('snsAccessToken', TType.STRING, 3)570            oprot.writeString(self.snsAccessToken.encode('utf-8') if sys.version_info[0] == 2 else self.snsAccessToken)571            oprot.writeFieldEnd()572        if self.toSnsUserId is not None:573            oprot.writeFieldBegin('toSnsUserId', TType.STRING, 4)574            oprot.writeString(self.toSnsUserId.encode('utf-8') if sys.version_info[0] == 2 else self.toSnsUserId)575            oprot.writeFieldEnd()576        oprot.writeFieldStop()577        oprot.writeStructEnd()578    def validate(self):579        return580    def __repr__(self):581        L = ['%s=%r' % (key, value)582             for key, value in self.__dict__.items()]583        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))584    def __eq__(self, other):585        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__586    def __ne__(self, other):587        return not (self == other)588all_structs.append(postSnsInvitationMessage_args)589postSnsInvitationMessage_args.thrift_spec = (590    None,  # 0591    None,  # 1592    (2, TType.I32, 'snsIdType', None, None, ),  # 2593    (3, TType.STRING, 'snsAccessToken', 'UTF8', None, ),  # 3594    (4, TType.STRING, 'toSnsUserId', 'UTF8', None, ),  # 4595)596class postSnsInvitationMessage_result(object):597    """598    Attributes:599     - e600    """601    def __init__(self, e=None,):602        self.e = e603    def read(self, iprot):604        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:605            iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])606            return607        iprot.readStructBegin()608        while True:609            (fname, ftype, fid) = iprot.readFieldBegin()610            if ftype == TType.STOP:611                break612            if fid == 1:613                if ftype == TType.STRUCT:614                    self.e = TalkException()615                    self.e.read(iprot)616                else:617                    iprot.skip(ftype)618            else:619                iprot.skip(ftype)620            iprot.readFieldEnd()621        iprot.readStructEnd()622    def write(self, oprot):623        if oprot._fast_encode is not None and self.thrift_spec is not None:624            oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))625            return626        oprot.writeStructBegin('postSnsInvitationMessage_result')627        if self.e is not None:628            oprot.writeFieldBegin('e', TType.STRUCT, 1)629            self.e.write(oprot)630            oprot.writeFieldEnd()631        oprot.writeFieldStop()632        oprot.writeStructEnd()633    def validate(self):634        return635    def __repr__(self):636        L = ['%s=%r' % (key, value)637             for key, value in self.__dict__.items()]638        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))639    def __eq__(self, other):640        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__641    def __ne__(self, other):642        return not (self == other)643all_structs.append(postSnsInvitationMessage_result)644postSnsInvitationMessage_result.thrift_spec = (645    None,  # 0646    (1, TType.STRUCT, 'e', [TalkException, None], None, ),  # 1647)648fix_spec(all_structs)...app.js
Source:app.js  
1var Sonoff;2var refreshtime = false;3var nightmode   = false;4$( document ).on( "ready", function () {5	6	var $lang    = $( "html" ).attr( "lang" );7	var i18nfile = _BASEURL_ + 'tmp/cache/i18n/json_i18n_' + $lang + '.cache.json';8	//console.log( i18nfile );9	10	$.ajax( {11		        dataType: "json",12		        url     : i18nfile,13		        async   : false,14		        success : function ( data ) {15			16			        $.i18n().load( data );17		        }18	        } );19	20	21	checkNightmode( nightmodeconfig );22	checkForUpdate( true );23	24	25	$( '.double-scroll' ).doubleScroll(26		{27			contentElement     : "#device-list", // Widest element, if not specified first child element will be used28			scrollCss          : {29				'overflow-x': 'auto',30				'overflow-y': 'hidden'31			},32			contentCss         : {33				'overflow-x': 'auto',34				'overflow-y': 'hidden'35			},36			onlyIfScroll       : true, // top scrollbar is not shown if the bottom one is not present37			resetOnWindowResize: true, // recompute the top ScrollBar requirements when the window is resized38			timeToWaitForResize: 139		}40	);41	/**42	 * Sonoff Handler43	 * @type {Sonoff}44	 */45	46	47	48	Sonoff = new Sonoff( { timeout: 15 } );49	50	$( '[title][title!=""]' ).tooltip( {51		                                   html : true,52		                                   delay: 30053	                                   } );54	55	$( '.custom-file-input' ).on( 'change', function () {56		var filename = $( this ).val();57		filename     = filename.replace( /^.*\\/, "" );58		filename     = filename.match( /[^\\/]*$/ )[ 0 ];59		$( this ).next().html( filename );60	} );61	62	$( "a.reload" ).on( "click", function ( e ) {63		e.preventDefault();64		window.location.href = window.location.href;65	} );66	67	68	$( "#versionHolder" ).on( "click", function ( e ) {69		e.preventDefault();70		if ( $( this ).hasClass( "update-now" ) || $( "#versionHolder" ).data( "update-check" ) == "0" ) {71			window.location.href = _BASEURL_ + "selfupdate";72		} else {73			checkForUpdate( false );74		}75	} );76	77	78	//$( "select#language-switch" ).selectmenu( "option", "width", "80px" );79	80	var appendLoading = function ( elem, replace ) {81		var replace = replace || false;82		var loader  = $( '<div>', { class: "loader" } ).append(83			$( 'img', { src: _RESOURCESURL_ + "img/loading.gif" } ) );84		85		if ( replace ) {86			$( elem ).html( loader );87		} else {88			$( elem ).append( loader );89		}90	};91	92	//$( '.hamburger' ).click( function () {93	//	$( "#navi" ).toggleClass( "show" );94	//	$( '.hamburger' ).toggleClass( "open" );95	//} );96	97	if ( $( "#content" ).data( "refreshtime" ) !== "none" ) {98		refreshtime = $( "#content" ).data( "refreshtime" ) * 1000;99	}100	101	$( "input[type=\"number\"]" ).keydown( function ( e ) {102		// Allow: backspace, delete, tab, escape, enter and .103		if ( $.inArray( e.keyCode, [ 46, 8, 9, 27, 13, 110, 190 ] ) !== -1 ||104		     // Allow: Ctrl+A, Command+A105		     (106			     e.keyCode === 65 && (107				     e.ctrlKey === true || e.metaKey === true108			     )109		     ) ||110		     // Allow: home, end, left, right, down, up111		     (112			     e.keyCode >= 35 && e.keyCode <= 40113		     ) ) {114			// var it happen, don't do anything115			return;116		}117		// Ensure that it is a number and stop the keypress118		if ( (119			     e.shiftKey || (120			     e.keyCode < 48 || e.keyCode > 57121			     )122		     ) && (123			     e.keyCode < 96 || e.keyCode > 105124		     ) ) {125			e.preventDefault();126		}127	} );128	129	$( "select#language-switch" ).on( "change", function ( event, ui ) {130		var optionSelected = $( "option:selected", this );131		var valueSelected  = this.value;132		133		var curUrl           = window.location.toString() + "/" + valueSelected + "/";134		curUrl               = curUrl.replace( /([^:]\/)\/+/g, "$1" );135		window.location.href = curUrl;136		137		// var curUrl = window.location.toString();138		// curUrl     = curUrl.replace( /[\?\&][a-z]2/g, "" );139		// console.log( curUrl );140		//141		// window.location.href = curUrl + (142		//     curUrl.indexOf( "?" ) !== -1 ? "&" : "?"143		// ) + "lang=" + valueSelected;144	} );145	146} );147function notifyMe( msg, title ) {148	var title = title || "";149	if ( title != "" ) {150		title = " - " + title;151	}152	153	var icon = "./resources/img/favicons/apple-icon-180x180.png";154	155	// Let's check if the browser supports notifications156	if ( !(157		"Notification" in window158	) ) {159		return;160	}161	162	163	// Let's check whether notification permissions have already been granted164	else if ( Notification.permission === "granted" ) {165		// If it's okay let's create a notification166		var notification = new Notification( "TasmoAdmin" + title, { body: msg, icon: icon } );167		setTimeout( notification.close.bind( notification ), 3000 );168	}169	170	// Otherwise, we need to ask the user for permission171	else if ( Notification.permission !== 'denied' ) {172		Notification.requestPermission( function ( permission ) {173			// If the user accepts, let's create a notification174			if ( permission === "granted" ) {175				var notification = new Notification( "TasmoAdmin" + title, { body: msg } );176				setTimeout( notification.close.bind( notification ), 3000 );177			}178		} );179	}180	181	// Finally, if the user has denied notifications and you182	// want to be respectful there is no need to bother them any more.183}184$.fn.attachDragger = function () {185	var attachment = false, lastPosition, position, difference;186	$( $( this ).selector ).on( "mousedown mouseup mousemove", function ( e ) {187		if ( e.type == "mousedown" && !$( e.target ).hasClass( "tablesaw-cell-content" ) ) {188			attachment = true, lastPosition = [ e.clientX, e.clientY ];189			$( ".tablesaw-cell-content" ).addClass( "dontselect" );190		}191		if ( e.type == "mouseup" ) {192			attachment = false;193			$( ".tablesaw-cell-content" ).removeClass( "dontselect" );194		}195		if ( e.type == "mousemove" && attachment == true ) {196			position   = [ e.clientX, e.clientY ];197			difference = [198				(199					position[ 0 ] - lastPosition[ 0 ]200				),201				(202					position[ 1 ] - lastPosition[ 1 ]203				)204			];205			$( this ).scrollLeft( $( this ).scrollLeft() - difference[ 0 ] );206			$( this ).scrollTop( $( this ).scrollTop() - difference[ 1 ] );207			lastPosition = [ e.clientX, e.clientY ];208		}209	} );210	$( window ).on( "mouseup", function () {211		attachment = false;212		$( ".tablesaw-cell-content" ).removeClass( "dontselect" );213	} );214};215var parseVersion = function ( versionString ) {216	versionString = versionString.replace( "-minimal", "" ).replace( /\./g, "" );217	218	var last = versionString.slice( -1 );219	if ( isNaN( last ) ) {220		versionString = versionString.replace(221			last,222			(223				last.charCodeAt( 0 ) - 97 < 10224				? "0" + (225					last.charCodeAt( 0 ) - 97226				)227				: last.charCodeAt( 0 ) - 97228			)229		);230	} else {231		versionString = versionString + "00";232	}233	234	return versionString;235};236function getTemp( data, joinString ) {237	var temp       = [];238	var joinString = joinString || "<br/>";239	240	if ( data.StatusSNS.TempUnit == undefined ) {241		data.StatusSNS.TempUnit = "F";242	}243	244	if ( data.StatusSNS.DS18B20 !== undefined ) {245		temp.push( (246			           data.StatusSNS.DS18B20.Temperature + "°" + data.StatusSNS.TempUnit247		           ) );248	}249	if ( data.StatusSNS.DS18x20 !== undefined ) {250		if ( data.StatusSNS.DS18x20.DS1 !== undefined ) {251			temp.push( (252				           data.StatusSNS.DS18x20.DS1.Temperature + "°" + data.StatusSNS.TempUnit253			           ) );254		}255		if ( data.StatusSNS.DS18x20.DS2 !== undefined ) {256			temp.push( (257				           data.StatusSNS.DS18x20.DS2.Temperature + "°" + data.StatusSNS.TempUnit258			           ) );259		}260		if ( data.StatusSNS.DS18x20.DS3 !== undefined ) {261			temp.push( (262				           data.StatusSNS.DS18x20.DS3.Temperature + "°" + data.StatusSNS.TempUnit263			           ) );264		}265		if ( data.StatusSNS.DS18x20.DS4 !== undefined ) {266			temp.push( (267				           data.StatusSNS.DS18x20.DS4.Temperature + "°" + data.StatusSNS.TempUnit268			           ) );269		}270		if ( data.StatusSNS.DS18x20.DS5 !== undefined ) {271			temp.push( (272				           data.StatusSNS.DS18x20.DS5.Temperature + "°" + data.StatusSNS.TempUnit273			           ) );274		}275	}276	277	//6.1.1c 20180904278	if ( data.StatusSNS[ "DS18B20-1" ] !== undefined ) {279		temp.push( (280			           data.StatusSNS[ "DS18B20-1" ].Temperature + "°" + data.StatusSNS.TempUnit281		           ) );282	}283	if ( data.StatusSNS[ "DS18B20-2" ] !== undefined ) {284		temp.push( (285			           data.StatusSNS[ "DS18B20-2" ].Temperature + "°" + data.StatusSNS.TempUnit286		           ) );287	}288	if ( data.StatusSNS[ "DS18B20-3" ] !== undefined ) {289		temp.push( (290			           data.StatusSNS[ "DS18B20-3" ].Temperature + "°" + data.StatusSNS.TempUnit291		           ) );292	}293	if ( data.StatusSNS[ "DS18B20-4" ] !== undefined ) {294		temp.push( (295			           data.StatusSNS[ "DS18B20-4" ].Temperature + "°" + data.StatusSNS.TempUnit296		           ) );297	}298	if ( data.StatusSNS[ "DS18B20-5" ] !== undefined ) {299		temp.push( (300			           data.StatusSNS[ "DS18B20-5" ].Temperature + "°" + data.StatusSNS.TempUnit301		           ) );302	}303	304	305	if ( data.StatusSNS.DHT11 !== undefined ) {306		temp.push( (307			           data.StatusSNS.DHT11.Temperature + "°" + data.StatusSNS.TempUnit308		           ) );309	}310	if ( data.StatusSNS.AM2301 !== undefined ) {311		temp.push( (312			           data.StatusSNS.AM2301.Temperature + "°" + data.StatusSNS.TempUnit313		           ) );314	}315	if ( data.StatusSNS.SHT3X !== undefined ) {316		temp.push( (317			           data.StatusSNS.SHT3X.Temperature + "°" + data.StatusSNS.TempUnit318		           ) );319	}320	if ( data.StatusSNS[ "SHT3X-0x45" ] !== undefined ) {321		temp.push( (322			           data.StatusSNS[ "SHT3X-0x45" ].Temperature + "°" + data.StatusSNS.TempUnit323		           ) );324	}325	if ( data.StatusSNS.BMP280 !== undefined ) {326		temp.push( (327			           data.StatusSNS.BMP280.Temperature + "°" + data.StatusSNS.TempUnit328		           ) );329		330	}331	if ( data.StatusSNS.BME680 !== undefined ) {332		temp.push( (333			           data.StatusSNS.BME680.Temperature + "°" + data.StatusSNS.TempUnit334		           ) );335	}336	if ( data.StatusSNS.BME280 !== undefined ) {337		temp.push( (338			           data.StatusSNS.BME280.Temperature + "°" + data.StatusSNS.TempUnit339		           ) );340	}341	if ( data.StatusSNS[ "BME280-76" ] !== undefined ) {342		temp.push( data.StatusSNS[ "BME280-76" ].Temperature + "°" + data.StatusSNS.TempUnit );343	}344	if ( data.StatusSNS[ "BME280-77" ] !== undefined ) {345		temp.push( data.StatusSNS[ "BME280-77" ].Temperature + "°" + data.StatusSNS.TempUnit );346	}347	if ( data.StatusSNS.SI7021 !== undefined ) {348		temp.push( (349			           data.StatusSNS.SI7021.Temperature + "°" + data.StatusSNS.TempUnit350		           ) );351	}352	if ( data.StatusSNS.HTU21 !== undefined ) {353		temp.push( (354			           data.StatusSNS.HTU21.Temperature + "°" + data.StatusSNS.TempUnit355		           ) );356	}357	if ( data.StatusSNS.BMP180 !== undefined ) {358		temp.push( (359			           data.StatusSNS.BMP180.Temperature + "°" + data.StatusSNS.TempUnit360		           ) );361	}362	363	//console.log( temp );364	365	return temp.join( joinString );366}367function getHumidity( data, joinString ) {368	var humi       = [];369	var joinString = joinString || "<br/>";370	371	if ( data.StatusSNS.AM2301 !== undefined ) {372		if ( data.StatusSNS.AM2301.Humidity !== undefined ) {373			humi.push( data.StatusSNS.AM2301.Humidity + "%" );374		}375	}376	if ( data.StatusSNS.BME280 !== undefined ) {377		if ( data.StatusSNS.BME280.Humidity !== undefined ) {378			humi.push( data.StatusSNS.BME280.Humidity + "%" );379		}380	}381	382	if ( data.StatusSNS[ "BME280-76" ] !== undefined ) {383		if ( data.StatusSNS[ "BME280-76" ].Humidity !== undefined ) {384			humi.push( data.StatusSNS[ "BME280-76" ].Humidity + "%" );385		}386	}387	if ( data.StatusSNS[ "BME280-77" ] !== undefined ) {388		if ( data.StatusSNS[ "BME280-77" ].Humidity !== undefined ) {389			humi.push( data.StatusSNS[ "BME280-77" ].Humidity + "%" );390		}391	}392	if ( data.StatusSNS.BME680 !== undefined ) {393		if ( data.StatusSNS.BME680.Humidity !== undefined ) {394			humi.push( data.StatusSNS.BME680.Humidity + "%" );395		}396	}397	if ( data.StatusSNS.DHT11 !== undefined ) {398		if ( data.StatusSNS.DHT11.Humidity !== undefined ) {399			humi.push( data.StatusSNS.DHT11.Humidity + "%" );400		}401	}402	if ( data.StatusSNS.SHT3X !== undefined ) {403		if ( data.StatusSNS.SHT3X.Humidity !== undefined ) {404			humi.push( data.StatusSNS.SHT3X.Humidity + "%" );405		}406	}407	if ( data.StatusSNS[ "SHT3X-0x45" ] !== undefined ) {408		if ( data.StatusSNS[ "SHT3X-0x45" ].Humidity !== undefined ) {409			humi.push( data.StatusSNS[ "SHT3X-0x45" ].Humidity + "%" );410		}411	}412	if ( data.StatusSNS.SI7021 !== undefined ) {413		if ( data.StatusSNS.SI7021.Humidity !== undefined ) {414			humi.push( data.StatusSNS.SI7021.Humidity + "%" );415		}416	}417	if ( data.StatusSNS.HTU21 !== undefined ) {418		if ( data.StatusSNS.HTU21.Humidity !== undefined ) {419			humi.push( data.StatusSNS.HTU21.Humidity + "%" );420		}421	}422	423	//console.log( humi );424	425	return humi.join( joinString );426}427function getPressure( data, joinString ) {428	var press      = [];429	var joinString = joinString || "<br/>";430	431	if ( data.StatusSNS.BME280 !== undefined ) {432		if ( data.StatusSNS.BME280.Pressure !== undefined ) {433			press.push( data.StatusSNS.BME280.Pressure + " hPa" );434		}435	}436	if ( data.StatusSNS[ "BME280-76" ] !== undefined ) {437		if ( data.StatusSNS[ "BME280-76" ].Pressure !== undefined ) {438			press.push( data.StatusSNS[ "BME280-76" ].Pressure + " hPa" );439		}440	}441	if ( data.StatusSNS[ "BME280-77" ] !== undefined ) {442		if ( data.StatusSNS[ "BME280-77" ].Pressure !== undefined ) {443			press.push( data.StatusSNS[ "BME280-77" ].Pressure + " hPa" );444		}445	}446	if ( data.StatusSNS.BMP280 !== undefined ) {447		if ( data.StatusSNS.BMP280.Pressure !== undefined ) {448			press.push( data.StatusSNS.BMP280.Pressure + " hPa" );449		}450	}451	if ( data.StatusSNS.BME680 !== undefined ) {452		if ( data.StatusSNS.BME680.Pressure !== undefined ) {453			press.push( data.StatusSNS.BME680.Pressure + " hPa" );454		}455	}456	if ( data.StatusSNS.BMP180 !== undefined ) {457		if ( data.StatusSNS.BMP180.Pressure !== undefined ) {458			press.push( data.StatusSNS.BMP180.Pressure + " hPa" );459		}460	}461	462	//console.log( press );463	464	return press.join( joinString );465}466function getSeaPressure( data, joinString ) {467	var press      = [];468	var joinString = joinString || "<br/>";469	470	if ( data.StatusSNS.BMP180 !== undefined ) {471		if ( data.StatusSNS.BMP180.SeaPressure !== undefined ) {472			press.push( data.StatusSNS.BMP180.SeaPressure + " hPa" );473		}474	}475	476	//console.log( press );477	478	return press.join( joinString );479}480function getDistance( data, joinString ) {481	var dist       = [];482	var joinString = joinString || "<br/>";483	484	if ( data.StatusSNS.SR04 !== undefined ) {485		if ( data.StatusSNS.SR04.Distance !== undefined ) {486			dist.push( data.StatusSNS.SR04.Distance + "cm" );487		}488	}489	490	//console.log( press );491	492	return dist.join( joinString );493}494function getEnergyPower( data, joinString ) {495	var enerygPower = [];496	var joinString  = joinString || "<br/>";497	498	if ( data.StatusSNS.ENERGY !== undefined ) {499		if ( data.StatusSNS.ENERGY.Power !== undefined ) {500			enerygPower.push( data.StatusSNS.ENERGY.Power + "W" );501		}502		503		if ( data.StatusSNS.ENERGY.Today !== undefined ) {504			var tmpString = data.StatusSNS.ENERGY.Today;505			if ( data.StatusSNS.ENERGY.Yesterday !== undefined ) {506				tmpString += "/" + data.StatusSNS.ENERGY.Yesterday;507			}508			enerygPower.push( tmpString + "kWh" );509		}510		511		if ( data.StatusSNS.ENERGY.Current !== undefined ) {512			enerygPower.push( data.StatusSNS.ENERGY.Current + "A" );513		}514	}515	//console.log( press );516	517	return enerygPower.join( joinString );518}519//function getEnergyTodayYesterday( data ) {520//	var energyTodayYesterday = [];521//522//	if ( data.StatusSNS.ENERGY !== undefined ) {523//		if ( data.StatusSNS.ENERGY.Today !== undefined ) {524//			var tmpString = data.StatusSNS.ENERGY.Today;525//			if ( data.StatusSNS.ENERGY.Yesterday !== undefined ) {526//				tmpString += "/" + data.StatusSNS.ENERGY.Today;527//			}528//			energyTodayYesterday.push( tmpString + "kWh" );529//		}530//	}531//532//	//console.log( press );533//534//	return energyTodayYesterday.join( joinString );535//}536Date.prototype.addHours = function ( h ) {537	this.setHours( this.getHours() + h );538	return this;539};540function getGas( data, joinString ) {541	var gas        = [];542	var joinString = joinString || "<br/>";543	544	if ( data.StatusSNS.BME680 !== undefined ) {545		if ( data.StatusSNS.BME680.Gas !== undefined ) {546			gas.push( data.StatusSNS.BME680.Gas + "kOhm" );547		}548	}549	550	//console.log( press );551	552	return gas.join( joinString );553}554function checkNightmode( config ) {555	console.log( "[APP][checkNightmode] Start" );556	var config = config || "auto";557	558	var currentTime = new Date();559	var hour        = currentTime.getHours();560	561	//console.log( "check Nightmode => " + hour + "h - " + config );562	563	564	if ( config === "disable" ) {565		$( "body" ).removeClass( "nightmode" );566		console.log( "[APP][checkNightmode] disabled" );567	} else {568		if ( config === "auto" ) {569			console.log( "[APP][checkNightmode] check time" );570			if ( hour >= 18 || hour <= 8 ) {   //@TODO: get sunrise by geo571				$( "body" ).addClass( "nightmode" );572				console.log( "[APP][checkNightmode] its night" );573			} else {574				$( "body" ).removeClass( "nightmode" );575				console.log( "[APP][checkNightmode] its day" );576			}577			578			579			setTimeout( function () {580				checkNightmode( config );581			}, 15 * 60 * 1000 );582			583		} else if ( config === "always" ) {584			console.log( "[APP][checkNightmode] always" );585			$( "body" ).addClass( "nightmode" );586		}587	}588	if ( $( "body" ).hasClass( "nightmode" ) ) {589		nightmode = true;590	}591}592function checkForUpdate( timer ) {593	if ( $( "#versionHolder" ).data( "update-check" ) == "0" ) {594		console.log( "[APP][checkForUpdate] Update check is disabed" );595		$( "#update-icon" ).remove();596		return;597	}598	console.log( "[APP][checkForUpdate] Start" );599	var timer         = timer || true;600	var icon          = $( "#update-icon" );601	var currentGitTag = icon.data( "current_git_tag" );602	603	if ( icon.parent().hasClass( "update-now" ) ) {604		console.log( "[APP][checkForUpdate] NEW VERSION FOUND ALREADY" );605		return true;606	}607	608	if ( icon.hasClass( "fa-spin" ) ) {609		console.log( "[APP][checkForUpdate] Still searching" );610		return false;611	}612	613	icon.removeClass( "fa-check" )614	    .removeClass( "fa-question" )615	    .removeClass( "fa-times" )616	    .addClass( "fa-sync" )617	    .addClass( "fa-spin" );618	619	var action = "releases/latest";620	if ( currentGitTag.indexOf( "beta" ) !== false ) {621		action = "releases";622	}623	var githubApiRelease = "https://api.github.com/repos/reloxx13/TasmoAdmin/" + action;624	625	$.get( githubApiRelease, {}, function ( result ) {626		if ( result !== undefined ) {627			if ( Array.isArray( result ) ) {628				result = result[ 0 ];629			}630			if ( result.tag_name !== undefined ) {631				var latestTag = result.tag_name;632				console.log( "[APP][checkForUpdate] latestTag => " + latestTag );633				if ( latestTag != currentGitTag ) {634					console.log( "[APP][checkForUpdate] NEW VERSION FOUND" );635					if ( result.assets.length !== 3 ) {636						console.log( "[APP][checkForUpdate] Seems like Travis is not done yet" );637						icon.removeClass( "fa-sync" ).addClass( "fa-check" );638						if ( timer ) {639							setTimeout( checkForUpdate, 5 * 60 * 1000 );640						}641					} else {642						icon.removeClass( "fa-sync" )643						    .removeClass( "fa-spin" )644						    .addClass( "fa-cloud-download-alt" )645						    .parent()646						    .addClass(647							    "update-now" );648					}649				} else {650					console.log( "[APP][checkForUpdate] No update found" );651					icon.removeClass( "fa-sync" ).addClass( "fa-check" );652					if ( timer ) {653						setTimeout( checkForUpdate, 15 * 60 * 1000 );654					}655				}656			} else {657				if ( result.message !== undefined ) {658					icon.removeClass( "fa-sync" ).removeClass( "fa-spin" ).addClass( "fa-times" );659					console.log( "[APP][checkForUpdate] Github Error => " + result.message );660					setTimeout( checkForUpdate, 30 * 60 * 1000 );661				}662			}663		}664		665		666		icon.removeClass( "fa-spin" );667		668	}, "json" ).fail( function ( result ) {669		icon.removeClass( "fa-sync" ).removeClass( "fa-spin" ).addClass( "fa-times" );670		//console.log( result );671		console.log( "[APP][checkForUpdate] Github Error => " + result.status + ": " + result.responseJSON.message );672		setTimeout( checkForUpdate, 30 * 60 * 1000 );673	} );674	675}676jQuery.fn.shake = function ( intShakes, intDistance, intDuration ) {677	this.each( function () {678		$( this ).css( "position", "relative" );679		for ( var x = 1; x <= intShakes; x++ ) {680			$( this ).animate(681				{682					left: (683						intDistance * -1684					)685				},686				(687					(688						(689						intDuration / intShakes690						) / 4691					)692				)693			)694			         .animate(695				         { left: intDistance },696				         (697					         (698					         intDuration / intShakes699					         ) / 2700				         )701			         )702			         .animate(703				         { left: 0 },704				         (705					         (706						         (707						         intDuration / intShakes708						         ) / 4709					         )710				         )711			         );712		}713	} );714	return this;...SensorPacket.js
Source:SensorPacket.js  
1// Auto-generated. Do not edit!2// (in-package tae_psoc.msg)3"use strict";4const _serializer = _ros_msg_utils.Serialize;5const _arraySerializer = _serializer.Array;6const _deserializer = _ros_msg_utils.Deserialize;7const _arrayDeserializer = _deserializer.Array;8const _finder = _ros_msg_utils.Find;9const _getByteLength = _ros_msg_utils.getByteLength;10//-----------------------------------------------------------11class SensorPacket {12  constructor(initObj={}) {13    if (initObj === null) {14      // initObj === null is a special case for deserialization where we don't initialize fields15      this.sns_1_FFT_NS = null;16      this.sns_1_FFT_WE = null;17      this.sns_1_4Ch = null;18      this.sns_1_F_M = null;19      this.sns_2_FFT_NS = null;20      this.sns_2_FFT_WE = null;21      this.sns_2_4Ch = null;22      this.sns_2_F_M = null;23      this.sns1_vorticity = null;24      this.sns2_vorticity = null;25    }26    else {27      if (initObj.hasOwnProperty('sns_1_FFT_NS')) {28        this.sns_1_FFT_NS = initObj.sns_1_FFT_NS29      }30      else {31        this.sns_1_FFT_NS = [];32      }33      if (initObj.hasOwnProperty('sns_1_FFT_WE')) {34        this.sns_1_FFT_WE = initObj.sns_1_FFT_WE35      }36      else {37        this.sns_1_FFT_WE = [];38      }39      if (initObj.hasOwnProperty('sns_1_4Ch')) {40        this.sns_1_4Ch = initObj.sns_1_4Ch41      }42      else {43        this.sns_1_4Ch = [];44      }45      if (initObj.hasOwnProperty('sns_1_F_M')) {46        this.sns_1_F_M = initObj.sns_1_F_M47      }48      else {49        this.sns_1_F_M = [];50      }51      if (initObj.hasOwnProperty('sns_2_FFT_NS')) {52        this.sns_2_FFT_NS = initObj.sns_2_FFT_NS53      }54      else {55        this.sns_2_FFT_NS = [];56      }57      if (initObj.hasOwnProperty('sns_2_FFT_WE')) {58        this.sns_2_FFT_WE = initObj.sns_2_FFT_WE59      }60      else {61        this.sns_2_FFT_WE = [];62      }63      if (initObj.hasOwnProperty('sns_2_4Ch')) {64        this.sns_2_4Ch = initObj.sns_2_4Ch65      }66      else {67        this.sns_2_4Ch = [];68      }69      if (initObj.hasOwnProperty('sns_2_F_M')) {70        this.sns_2_F_M = initObj.sns_2_F_M71      }72      else {73        this.sns_2_F_M = [];74      }75      if (initObj.hasOwnProperty('sns1_vorticity')) {76        this.sns1_vorticity = initObj.sns1_vorticity77      }78      else {79        this.sns1_vorticity = 0.0;80      }81      if (initObj.hasOwnProperty('sns2_vorticity')) {82        this.sns2_vorticity = initObj.sns2_vorticity83      }84      else {85        this.sns2_vorticity = 0.0;86      }87    }88  }89  static serialize(obj, buffer, bufferOffset) {90    // Serializes a message object of type SensorPacket91    // Serialize message field [sns_1_FFT_NS]92    bufferOffset = _arraySerializer.uint16(obj.sns_1_FFT_NS, buffer, bufferOffset, null);93    // Serialize message field [sns_1_FFT_WE]94    bufferOffset = _arraySerializer.uint16(obj.sns_1_FFT_WE, buffer, bufferOffset, null);95    // Serialize message field [sns_1_4Ch]96    bufferOffset = _arraySerializer.int16(obj.sns_1_4Ch, buffer, bufferOffset, null);97    // Serialize message field [sns_1_F_M]98    bufferOffset = _arraySerializer.float32(obj.sns_1_F_M, buffer, bufferOffset, null);99    // Serialize message field [sns_2_FFT_NS]100    bufferOffset = _arraySerializer.uint16(obj.sns_2_FFT_NS, buffer, bufferOffset, null);101    // Serialize message field [sns_2_FFT_WE]102    bufferOffset = _arraySerializer.uint16(obj.sns_2_FFT_WE, buffer, bufferOffset, null);103    // Serialize message field [sns_2_4Ch]104    bufferOffset = _arraySerializer.int16(obj.sns_2_4Ch, buffer, bufferOffset, null);105    // Serialize message field [sns_2_F_M]106    bufferOffset = _arraySerializer.float32(obj.sns_2_F_M, buffer, bufferOffset, null);107    // Serialize message field [sns1_vorticity]108    bufferOffset = _serializer.float32(obj.sns1_vorticity, buffer, bufferOffset);109    // Serialize message field [sns2_vorticity]110    bufferOffset = _serializer.float32(obj.sns2_vorticity, buffer, bufferOffset);111    return bufferOffset;112  }113  static deserialize(buffer, bufferOffset=[0]) {114    //deserializes a message object of type SensorPacket115    let len;116    let data = new SensorPacket(null);117    // Deserialize message field [sns_1_FFT_NS]118    data.sns_1_FFT_NS = _arrayDeserializer.uint16(buffer, bufferOffset, null)119    // Deserialize message field [sns_1_FFT_WE]120    data.sns_1_FFT_WE = _arrayDeserializer.uint16(buffer, bufferOffset, null)121    // Deserialize message field [sns_1_4Ch]122    data.sns_1_4Ch = _arrayDeserializer.int16(buffer, bufferOffset, null)123    // Deserialize message field [sns_1_F_M]124    data.sns_1_F_M = _arrayDeserializer.float32(buffer, bufferOffset, null)125    // Deserialize message field [sns_2_FFT_NS]126    data.sns_2_FFT_NS = _arrayDeserializer.uint16(buffer, bufferOffset, null)127    // Deserialize message field [sns_2_FFT_WE]128    data.sns_2_FFT_WE = _arrayDeserializer.uint16(buffer, bufferOffset, null)129    // Deserialize message field [sns_2_4Ch]130    data.sns_2_4Ch = _arrayDeserializer.int16(buffer, bufferOffset, null)131    // Deserialize message field [sns_2_F_M]132    data.sns_2_F_M = _arrayDeserializer.float32(buffer, bufferOffset, null)133    // Deserialize message field [sns1_vorticity]134    data.sns1_vorticity = _deserializer.float32(buffer, bufferOffset);135    // Deserialize message field [sns2_vorticity]136    data.sns2_vorticity = _deserializer.float32(buffer, bufferOffset);137    return data;138  }139  static getMessageSize(object) {140    let length = 0;141    length += 2 * object.sns_1_FFT_NS.length;142    length += 2 * object.sns_1_FFT_WE.length;143    length += 2 * object.sns_1_4Ch.length;144    length += 4 * object.sns_1_F_M.length;145    length += 2 * object.sns_2_FFT_NS.length;146    length += 2 * object.sns_2_FFT_WE.length;147    length += 2 * object.sns_2_4Ch.length;148    length += 4 * object.sns_2_F_M.length;149    return length + 40;150  }151  static datatype() {152    // Returns string type for a message object153    return 'tae_psoc/SensorPacket';154  }155  static md5sum() {156    //Returns md5sum for a message object157    return 'b42cd8856cf6ff4337fc1ed6207fb9c0';158  }159  static messageDefinition() {160    // Returns full string definition for message161    return `162    uint16[] sns_1_FFT_NS163    uint16[] sns_1_FFT_WE164    int16[] sns_1_4Ch165    float32[] sns_1_F_M166    uint16[] sns_2_FFT_NS167    uint16[] sns_2_FFT_WE168    int16[] sns_2_4Ch169    float32[] sns_2_F_M170    float32 sns1_vorticity171    float32 sns2_vorticity172    173    174    `;175  }176  static Resolve(msg) {177    // deep-construct a valid message object instance of whatever was passed in178    if (typeof msg !== 'object' || msg === null) {179      msg = {};180    }181    const resolved = new SensorPacket(null);182    if (msg.sns_1_FFT_NS !== undefined) {183      resolved.sns_1_FFT_NS = msg.sns_1_FFT_NS;184    }185    else {186      resolved.sns_1_FFT_NS = []187    }188    if (msg.sns_1_FFT_WE !== undefined) {189      resolved.sns_1_FFT_WE = msg.sns_1_FFT_WE;190    }191    else {192      resolved.sns_1_FFT_WE = []193    }194    if (msg.sns_1_4Ch !== undefined) {195      resolved.sns_1_4Ch = msg.sns_1_4Ch;196    }197    else {198      resolved.sns_1_4Ch = []199    }200    if (msg.sns_1_F_M !== undefined) {201      resolved.sns_1_F_M = msg.sns_1_F_M;202    }203    else {204      resolved.sns_1_F_M = []205    }206    if (msg.sns_2_FFT_NS !== undefined) {207      resolved.sns_2_FFT_NS = msg.sns_2_FFT_NS;208    }209    else {210      resolved.sns_2_FFT_NS = []211    }212    if (msg.sns_2_FFT_WE !== undefined) {213      resolved.sns_2_FFT_WE = msg.sns_2_FFT_WE;214    }215    else {216      resolved.sns_2_FFT_WE = []217    }218    if (msg.sns_2_4Ch !== undefined) {219      resolved.sns_2_4Ch = msg.sns_2_4Ch;220    }221    else {222      resolved.sns_2_4Ch = []223    }224    if (msg.sns_2_F_M !== undefined) {225      resolved.sns_2_F_M = msg.sns_2_F_M;226    }227    else {228      resolved.sns_2_F_M = []229    }230    if (msg.sns1_vorticity !== undefined) {231      resolved.sns1_vorticity = msg.sns1_vorticity;232    }233    else {234      resolved.sns1_vorticity = 0.0235    }236    if (msg.sns2_vorticity !== undefined) {237      resolved.sns2_vorticity = msg.sns2_vorticity;238    }239    else {240      resolved.sns2_vorticity = 0.0241    }242    return resolved;243    }244};...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
