mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2025-06-11 04:42:23 +03:00
Added variables for repeatedly indexed keys
Repeatedly indexing keys is in general slow. And, not only is it slow, it makes reading code hell.
This commit is contained in:
parent
12fdbd0678
commit
21ab456e22
142
monitor.py
142
monitor.py
@ -8,6 +8,7 @@ from os.path import basename, expanduser, isdir, join
|
|||||||
from sys import platform
|
from sys import platform
|
||||||
from time import gmtime, localtime, sleep, strftime, strptime, time
|
from time import gmtime, localtime, sleep, strftime, strptime, time
|
||||||
from calendar import timegm
|
from calendar import timegm
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
if __debug__:
|
if __debug__:
|
||||||
from traceback import print_exc
|
from traceback import print_exc
|
||||||
@ -342,9 +343,11 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
return {'event': None} # Fake startup event
|
return {'event': None} # Fake startup event
|
||||||
|
|
||||||
try:
|
try:
|
||||||
entry = json.loads(line, object_pairs_hook=OrderedDict) # Preserve property order because why not?
|
entry: Dict[str, Any] = json.loads(line, object_pairs_hook=OrderedDict) # Preserve property order because why not?
|
||||||
entry['timestamp'] # we expect this to exist
|
entry['timestamp'] # we expect this to exist
|
||||||
if entry['event'] == 'Fileheader':
|
|
||||||
|
event_type = entry['event']
|
||||||
|
if event_type == 'Fileheader':
|
||||||
self.live = False
|
self.live = False
|
||||||
self.version = entry['gameversion']
|
self.version = entry['gameversion']
|
||||||
self.is_beta = 'beta' in entry['gameversion'].lower()
|
self.is_beta = 'beta' in entry['gameversion'].lower()
|
||||||
@ -386,10 +389,10 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
'Modules': None,
|
'Modules': None,
|
||||||
}
|
}
|
||||||
|
|
||||||
elif entry['event'] == 'Commander':
|
elif event_type == 'Commander':
|
||||||
self.live = True # First event in 3.0
|
self.live = True # First event in 3.0
|
||||||
|
|
||||||
elif entry['event'] == 'LoadGame':
|
elif event_type == 'LoadGame':
|
||||||
self.cmdr = entry['Commander']
|
self.cmdr = entry['Commander']
|
||||||
# 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event)
|
# 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event)
|
||||||
self.mode = entry.get('GameMode')
|
self.mode = entry.get('GameMode')
|
||||||
@ -417,11 +420,11 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
'Role': None,
|
'Role': None,
|
||||||
})
|
})
|
||||||
|
|
||||||
elif entry['event'] == 'NewCommander':
|
elif event_type == 'NewCommander':
|
||||||
self.cmdr = entry['Name']
|
self.cmdr = entry['Name']
|
||||||
self.group = None
|
self.group = None
|
||||||
|
|
||||||
elif entry['event'] == 'SetUserShipName':
|
elif event_type == 'SetUserShipName':
|
||||||
self.state['ShipID'] = entry['ShipID']
|
self.state['ShipID'] = entry['ShipID']
|
||||||
if 'UserShipId' in entry: # Only present when changing the ship's ident
|
if 'UserShipId' in entry: # Only present when changing the ship's ident
|
||||||
self.state['ShipIdent'] = entry['UserShipId']
|
self.state['ShipIdent'] = entry['UserShipId']
|
||||||
@ -429,7 +432,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
self.state['ShipName'] = entry.get('UserShipName')
|
self.state['ShipName'] = entry.get('UserShipName')
|
||||||
self.state['ShipType'] = self.canonicalise(entry['Ship'])
|
self.state['ShipType'] = self.canonicalise(entry['Ship'])
|
||||||
|
|
||||||
elif entry['event'] == 'ShipyardBuy':
|
elif event_type == 'ShipyardBuy':
|
||||||
self.state['ShipID'] = None
|
self.state['ShipID'] = None
|
||||||
self.state['ShipIdent'] = None
|
self.state['ShipIdent'] = None
|
||||||
self.state['ShipName'] = None
|
self.state['ShipName'] = None
|
||||||
@ -439,7 +442,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
self.state['Rebuy'] = None
|
self.state['Rebuy'] = None
|
||||||
self.state['Modules'] = None
|
self.state['Modules'] = None
|
||||||
|
|
||||||
elif entry['event'] == 'ShipyardSwap':
|
elif event_type == 'ShipyardSwap':
|
||||||
self.state['ShipID'] = entry['ShipID']
|
self.state['ShipID'] = entry['ShipID']
|
||||||
self.state['ShipIdent'] = None
|
self.state['ShipIdent'] = None
|
||||||
self.state['ShipName'] = None
|
self.state['ShipName'] = None
|
||||||
@ -449,7 +452,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
self.state['Rebuy'] = None
|
self.state['Rebuy'] = None
|
||||||
self.state['Modules'] = None
|
self.state['Modules'] = None
|
||||||
|
|
||||||
elif (entry['event'] == 'Loadout' and
|
elif (event_type == 'Loadout' and
|
||||||
'fighter' not in self.canonicalise(entry['Ship']) and
|
'fighter' not in self.canonicalise(entry['Ship']) and
|
||||||
'buggy' not in self.canonicalise(entry['Ship'])):
|
'buggy' not in self.canonicalise(entry['Ship'])):
|
||||||
self.state['ShipID'] = entry['ShipID']
|
self.state['ShipID'] = entry['ShipID']
|
||||||
@ -479,7 +482,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
|
|
||||||
self.state['Modules'][module['Slot']] = module
|
self.state['Modules'][module['Slot']] = module
|
||||||
|
|
||||||
elif entry['event'] == 'ModuleBuy':
|
elif event_type == 'ModuleBuy':
|
||||||
self.state['Modules'][entry['Slot']] = {
|
self.state['Modules'][entry['Slot']] = {
|
||||||
'Slot': entry['Slot'],
|
'Slot': entry['Slot'],
|
||||||
'Item': self.canonicalise(entry['BuyItem']),
|
'Item': self.canonicalise(entry['BuyItem']),
|
||||||
@ -489,29 +492,32 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
'Value': entry['BuyPrice'],
|
'Value': entry['BuyPrice'],
|
||||||
}
|
}
|
||||||
|
|
||||||
elif entry['event'] == 'ModuleSell':
|
elif event_type == 'ModuleSell':
|
||||||
self.state['Modules'].pop(entry['Slot'], None)
|
self.state['Modules'].pop(entry['Slot'], None)
|
||||||
|
|
||||||
elif entry['event'] == 'ModuleSwap':
|
elif event_type == 'ModuleSwap':
|
||||||
to_item = self.state['Modules'].get(entry['ToSlot'])
|
to_item = self.state['Modules'].get(entry['ToSlot'])
|
||||||
self.state['Modules'][entry['ToSlot']] = self.state['Modules'][entry['FromSlot']]
|
to_slot = entry['ToSlot']
|
||||||
|
from_slot = entry['FromSlot']
|
||||||
|
modules = self.state['Modules']
|
||||||
|
modules[to_slot] = modules[from_slot]
|
||||||
if to_item:
|
if to_item:
|
||||||
self.state['Modules'][entry['FromSlot']] = to_item
|
modules[from_slot] = to_item
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.state['Modules'].pop(entry['FromSlot'], None)
|
modules.pop(from_slot, None)
|
||||||
|
|
||||||
elif entry['event'] == 'Undocked':
|
elif event_type == 'Undocked':
|
||||||
self.station = None
|
self.station = None
|
||||||
self.station_marketid = None
|
self.station_marketid = None
|
||||||
self.stationtype = None
|
self.stationtype = None
|
||||||
self.stationservices = None
|
self.stationservices = None
|
||||||
|
|
||||||
elif entry['event'] in ('Location', 'FSDJump', 'Docked', 'CarrierJump'):
|
elif event_type in ('Location', 'FSDJump', 'Docked', 'CarrierJump'):
|
||||||
if entry['event'] in ('Location', 'CarrierJump'):
|
if event_type in ('Location', 'CarrierJump'):
|
||||||
self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
|
self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
|
||||||
|
|
||||||
elif entry['event'] == 'FSDJump':
|
elif event_type == 'FSDJump':
|
||||||
self.planet = None
|
self.planet = None
|
||||||
|
|
||||||
if 'StarPos' in entry:
|
if 'StarPos' in entry:
|
||||||
@ -522,7 +528,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
|
|
||||||
self.systemaddress = entry.get('SystemAddress')
|
self.systemaddress = entry.get('SystemAddress')
|
||||||
|
|
||||||
if entry['event'] in ('Location', 'FSDJump', 'CarrierJump'):
|
if event_type in ('Location', 'FSDJump', 'CarrierJump'):
|
||||||
self.systempopulation = entry.get('Population')
|
self.systempopulation = entry.get('Population')
|
||||||
|
|
||||||
self.system = 'CQC' if entry['StarSystem'] == 'ProvingGround' else entry['StarSystem']
|
self.system = 'CQC' if entry['StarSystem'] == 'ProvingGround' else entry['StarSystem']
|
||||||
@ -531,32 +537,34 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
self.stationtype = entry.get('StationType') # May be None
|
self.stationtype = entry.get('StationType') # May be None
|
||||||
self.stationservices = entry.get('StationServices') # None under E:D < 2.4
|
self.stationservices = entry.get('StationServices') # None under E:D < 2.4
|
||||||
|
|
||||||
elif entry['event'] == 'ApproachBody':
|
elif event_type == 'ApproachBody':
|
||||||
self.planet = entry['Body']
|
self.planet = entry['Body']
|
||||||
|
|
||||||
elif entry['event'] in ('LeaveBody', 'SupercruiseEntry'):
|
elif event_type in ('LeaveBody', 'SupercruiseEntry'):
|
||||||
self.planet = None
|
self.planet = None
|
||||||
|
|
||||||
elif entry['event'] in ('Rank', 'Promotion'):
|
elif event_type in ('Rank', 'Promotion'):
|
||||||
payload = dict(entry)
|
payload = dict(entry)
|
||||||
payload.pop('event')
|
payload.pop('event')
|
||||||
payload.pop('timestamp')
|
payload.pop('timestamp')
|
||||||
|
|
||||||
self.state['Rank'].update({k: (v, 0) for k, v in payload.items()})
|
self.state['Rank'].update({k: (v, 0) for k, v in payload.items()})
|
||||||
|
|
||||||
elif entry['event'] == 'Progress':
|
elif event_type == 'Progress':
|
||||||
|
rank = self.state['Rank']
|
||||||
for k, v in entry.items():
|
for k, v in entry.items():
|
||||||
if k in self.state['Rank']:
|
if k in rank:
|
||||||
# perhaps not taken promotion mission yet
|
# perhaps not taken promotion mission yet
|
||||||
self.state['Rank'][k] = (self.state['Rank'][k][0], min(v, 100))
|
rank[k] = (rank[k][0], min(v, 100))
|
||||||
|
|
||||||
elif entry['event'] in ('Reputation', 'Statistics'):
|
elif event_type in ('Reputation', 'Statistics'):
|
||||||
payload = OrderedDict(entry)
|
payload = OrderedDict(entry)
|
||||||
payload.pop('event')
|
payload.pop('event')
|
||||||
payload.pop('timestamp')
|
payload.pop('timestamp')
|
||||||
self.state[entry['event']] = payload
|
self.state[event_type] = payload
|
||||||
|
|
||||||
elif entry['event'] == 'EngineerProgress':
|
elif event_type == 'EngineerProgress':
|
||||||
|
engineers = self.state['Engineers']
|
||||||
if 'Engineers' in entry: # Startup summary
|
if 'Engineers' in entry: # Startup summary
|
||||||
self.state['Engineers'] = {
|
self.state['Engineers'] = {
|
||||||
e['Engineer']: (e['Rank'], e.get('RankProgress', 0))
|
e['Engineer']: (e['Rank'], e.get('RankProgress', 0))
|
||||||
@ -564,13 +572,14 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
}
|
}
|
||||||
|
|
||||||
else: # Promotion
|
else: # Promotion
|
||||||
|
engineer = entry['Engineer']
|
||||||
if 'Rank' in entry:
|
if 'Rank' in entry:
|
||||||
self.state['Engineers'][entry['Engineer']] = (entry['Rank'], entry.get('RankProgress', 0))
|
engineers[engineer] = (entry['Rank'], entry.get('RankProgress', 0))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.state['Engineers'][entry['Engineer']] = entry['Progress']
|
engineers[engineer] = entry['Progress']
|
||||||
|
|
||||||
elif entry['event'] == 'Cargo' and entry.get('Vessel') == 'Ship':
|
elif event_type == 'Cargo' and entry.get('Vessel') == 'Ship':
|
||||||
self.state['Cargo'] = defaultdict(int)
|
self.state['Cargo'] = defaultdict(int)
|
||||||
# From 3.3 full Cargo event (after the first one) is written to a separate file
|
# From 3.3 full Cargo event (after the first one) is written to a separate file
|
||||||
if 'Inventory' not in entry:
|
if 'Inventory' not in entry:
|
||||||
@ -579,41 +588,44 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
|
|
||||||
self.state['Cargo'].update({self.canonicalise(x['Name']): x['Count'] for x in entry['Inventory']})
|
self.state['Cargo'].update({self.canonicalise(x['Name']): x['Count'] for x in entry['Inventory']})
|
||||||
|
|
||||||
elif entry['event'] in ('CollectCargo', 'MarketBuy', 'BuyDrones', 'MiningRefined'):
|
elif event_type in ('CollectCargo', 'MarketBuy', 'BuyDrones', 'MiningRefined'):
|
||||||
commodity = self.canonicalise(entry['Type'])
|
commodity = self.canonicalise(entry['Type'])
|
||||||
self.state['Cargo'][commodity] += entry.get('Count', 1)
|
self.state['Cargo'][commodity] += entry.get('Count', 1)
|
||||||
|
|
||||||
elif entry['event'] in ('EjectCargo', 'MarketSell', 'SellDrones'):
|
elif event_type in ('EjectCargo', 'MarketSell', 'SellDrones'):
|
||||||
commodity = self.canonicalise(entry['Type'])
|
commodity = self.canonicalise(entry['Type'])
|
||||||
self.state['Cargo'][commodity] -= entry.get('Count', 1)
|
cargo = self.state['Cargo']
|
||||||
if self.state['Cargo'][commodity] <= 0:
|
cargo[commodity] -= entry.get('Count', 1)
|
||||||
self.state['Cargo'].pop(commodity)
|
if cargo[commodity] <= 0:
|
||||||
|
cargo.pop(commodity)
|
||||||
|
|
||||||
elif entry['event'] == 'SearchAndRescue':
|
elif event_type == 'SearchAndRescue':
|
||||||
for item in entry.get('Items', []):
|
for item in entry.get('Items', []):
|
||||||
commodity = self.canonicalise(item['Name'])
|
commodity = self.canonicalise(item['Name'])
|
||||||
self.state['Cargo'][commodity] -= item.get('Count', 1)
|
cargo = self.state['Cargo']
|
||||||
if self.state['Cargo'][commodity] <= 0:
|
cargo[commodity] -= item.get('Count', 1)
|
||||||
self.state['Cargo'].pop(commodity)
|
if cargo[commodity] <= 0:
|
||||||
|
cargo.pop(commodity)
|
||||||
|
|
||||||
elif entry['event'] == 'Materials':
|
elif event_type == 'Materials':
|
||||||
for category in ('Raw', 'Manufactured', 'Encoded'):
|
for category in ('Raw', 'Manufactured', 'Encoded'):
|
||||||
self.state[category] = defaultdict(int)
|
self.state[category] = defaultdict(int)
|
||||||
self.state[category].update({
|
self.state[category].update({
|
||||||
self.canonicalise(x['Name']): x['Count'] for x in entry.get(category, [])
|
self.canonicalise(x['Name']): x['Count'] for x in entry.get(category, [])
|
||||||
})
|
})
|
||||||
|
|
||||||
elif entry['event'] == 'MaterialCollected':
|
elif event_type == 'MaterialCollected':
|
||||||
material = self.canonicalise(entry['Name'])
|
material = self.canonicalise(entry['Name'])
|
||||||
self.state[entry['Category']][material] += entry['Count']
|
self.state[entry['Category']][material] += entry['Count']
|
||||||
|
|
||||||
elif entry['event'] in ('MaterialDiscarded', 'ScientificResearch'):
|
elif event_type in ('MaterialDiscarded', 'ScientificResearch'):
|
||||||
material = self.canonicalise(entry['Name'])
|
material = self.canonicalise(entry['Name'])
|
||||||
self.state[entry['Category']][material] -= entry['Count']
|
state_category = self.state[entry['Category']]
|
||||||
if self.state[entry['Category']][material] <= 0:
|
state_category[material] -= entry['Count']
|
||||||
self.state[entry['Category']].pop(material)
|
if state_category[material] <= 0:
|
||||||
|
state_category.pop(material)
|
||||||
|
|
||||||
elif entry['event'] == 'Synthesis':
|
elif event_type == 'Synthesis':
|
||||||
for category in ('Raw', 'Manufactured', 'Encoded'):
|
for category in ('Raw', 'Manufactured', 'Encoded'):
|
||||||
for x in entry['Materials']:
|
for x in entry['Materials']:
|
||||||
material = self.canonicalise(x['Name'])
|
material = self.canonicalise(x['Name'])
|
||||||
@ -622,17 +634,21 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
if self.state[category][material] <= 0:
|
if self.state[category][material] <= 0:
|
||||||
self.state[category].pop(material)
|
self.state[category].pop(material)
|
||||||
|
|
||||||
elif entry['event'] == 'MaterialTrade':
|
elif event_type == 'MaterialTrade':
|
||||||
category = self.category(entry['Paid']['Category'])
|
category = self.category(entry['Paid']['Category'])
|
||||||
self.state[category][entry['Paid']['Material']] -= entry['Paid']['Quantity']
|
state_category = self.state[category]
|
||||||
if self.state[category][entry['Paid']['Material']] <= 0:
|
paid = entry['Paid']
|
||||||
self.state[category].pop(entry['Paid']['Material'])
|
received = entry['Received']
|
||||||
|
|
||||||
category = self.category(entry['Received']['Category'])
|
state_category[paid['Material']] -= paid['Quantity']
|
||||||
self.state[category][entry['Received']['Material']] += entry['Received']['Quantity']
|
if state_category[paid['Material']] <= 0:
|
||||||
|
state_category.pop(paid['Material'])
|
||||||
|
|
||||||
elif entry['event'] == 'EngineerCraft' or (
|
category = self.category(received['Category'])
|
||||||
entry['event'] == 'EngineerLegacyConvert' and not entry.get('IsPreview')
|
state_category[received['Material']] += received['Quantity']
|
||||||
|
|
||||||
|
elif event_type == 'EngineerCraft' or (
|
||||||
|
event_type == 'EngineerLegacyConvert' and not entry.get('IsPreview')
|
||||||
):
|
):
|
||||||
|
|
||||||
for category in ('Raw', 'Manufactured', 'Encoded'):
|
for category in ('Raw', 'Manufactured', 'Encoded'):
|
||||||
@ -663,7 +679,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
module['Engineering'].pop('ExperimentalEffect', None)
|
module['Engineering'].pop('ExperimentalEffect', None)
|
||||||
module['Engineering'].pop('ExperimentalEffect_Localised', None)
|
module['Engineering'].pop('ExperimentalEffect_Localised', None)
|
||||||
|
|
||||||
elif entry['event'] == 'MissionCompleted':
|
elif event_type == 'MissionCompleted':
|
||||||
for reward in entry.get('CommodityReward', []):
|
for reward in entry.get('CommodityReward', []):
|
||||||
commodity = self.canonicalise(reward['Name'])
|
commodity = self.canonicalise(reward['Name'])
|
||||||
self.state['Cargo'][commodity] += reward.get('Count', 1)
|
self.state['Cargo'][commodity] += reward.get('Count', 1)
|
||||||
@ -674,7 +690,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
material = self.canonicalise(reward['Name'])
|
material = self.canonicalise(reward['Name'])
|
||||||
self.state[category][material] += reward.get('Count', 1)
|
self.state[category][material] += reward.get('Count', 1)
|
||||||
|
|
||||||
elif entry['event'] == 'EngineerContribution':
|
elif event_type == 'EngineerContribution':
|
||||||
commodity = self.canonicalise(entry.get('Commodity'))
|
commodity = self.canonicalise(entry.get('Commodity'))
|
||||||
if commodity:
|
if commodity:
|
||||||
self.state['Cargo'][commodity] -= entry['Quantity']
|
self.state['Cargo'][commodity] -= entry['Quantity']
|
||||||
@ -689,7 +705,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
if self.state[category][material] <= 0:
|
if self.state[category][material] <= 0:
|
||||||
self.state[category].pop(material)
|
self.state[category].pop(material)
|
||||||
|
|
||||||
elif entry['event'] == 'TechnologyBroker':
|
elif event_type == 'TechnologyBroker':
|
||||||
for thing in entry.get('Ingredients', []): # 3.01
|
for thing in entry.get('Ingredients', []): # 3.01
|
||||||
for category in ('Cargo', 'Raw', 'Manufactured', 'Encoded'):
|
for category in ('Cargo', 'Raw', 'Manufactured', 'Encoded'):
|
||||||
item = self.canonicalise(thing['Name'])
|
item = self.canonicalise(thing['Name'])
|
||||||
@ -711,7 +727,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
if self.state[category][material] <= 0:
|
if self.state[category][material] <= 0:
|
||||||
self.state[category].pop(material)
|
self.state[category].pop(material)
|
||||||
|
|
||||||
elif entry['event'] == 'JoinACrew':
|
elif event_type == 'JoinACrew':
|
||||||
self.state['Captain'] = entry['Captain']
|
self.state['Captain'] = entry['Captain']
|
||||||
self.state['Role'] = 'Idle'
|
self.state['Role'] = 'Idle'
|
||||||
self.planet = None
|
self.planet = None
|
||||||
@ -723,10 +739,10 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
self.coordinates = None
|
self.coordinates = None
|
||||||
self.systemaddress = None
|
self.systemaddress = None
|
||||||
|
|
||||||
elif entry['event'] == 'ChangeCrewRole':
|
elif event_type == 'ChangeCrewRole':
|
||||||
self.state['Role'] = entry['Role']
|
self.state['Role'] = entry['Role']
|
||||||
|
|
||||||
elif entry['event'] == 'QuitACrew':
|
elif event_type == 'QuitACrew':
|
||||||
self.state['Captain'] = None
|
self.state['Captain'] = None
|
||||||
self.state['Role'] = None
|
self.state['Role'] = None
|
||||||
self.planet = None
|
self.planet = None
|
||||||
@ -738,7 +754,7 @@ class EDLogs(FileSystemEventHandler):
|
|||||||
self.coordinates = None
|
self.coordinates = None
|
||||||
self.systemaddress = None
|
self.systemaddress = None
|
||||||
|
|
||||||
elif entry['event'] == 'Friends':
|
elif event_type == 'Friends':
|
||||||
if entry['Status'] in ('Online', 'Added'):
|
if entry['Status'] in ('Online', 'Added'):
|
||||||
self.state['Friends'].add(entry['Name'])
|
self.state['Friends'].add(entry['Name'])
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user