Skip to content

Commit a5ea835

Browse files
committed
improve name to sku and vice versa
1 parent 30a5e57 commit a5ea835

File tree

5 files changed

+361
-150
lines changed

5 files changed

+361
-150
lines changed

src/tf2_utils/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
__title__ = "tf2-utils"
22
__author__ = "offish"
3-
__version__ = "2.3.2"
3+
__version__ = "2.3.3"
44
__license__ = "MIT"
55

66
from .currency import CurrencyExchange
77
from .exceptions import InvalidInventory, TF2UtilsError
88
from .inventory import Inventory, map_inventory
99
from .item import Item
10+
from .item_name import *
1011
from .marketplace_tf import (
1112
MarketplaceTF,
1213
MarketplaceTFException,
@@ -27,4 +28,4 @@
2728
from .sku import *
2829
from .utils import *
2930

30-
# flake8: noqa
31+
# flake8: noqa: F401, F403

src/tf2_utils/item_name.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from tf2_data import EFFECTS, QUALITIES
2+
3+
__all__ = [
4+
"has_festivized_in_name",
5+
"has_uncraftable_in_name",
6+
"has_non_craftable_in_name",
7+
"is_craftable",
8+
"has_australium_in_name",
9+
"has_strange_in_name",
10+
"has_basic_killstreak_in_name",
11+
"has_specialized_killstreak_in_name",
12+
"has_professional_killstreak_in_name",
13+
"has_killstreak_in_name",
14+
"get_effect_in_name",
15+
"get_quality_from_name",
16+
]
17+
18+
QUALITY_NAMES = [
19+
"Genuine",
20+
"Vintage",
21+
"Unusual",
22+
"Unique",
23+
"Strange",
24+
"Haunted",
25+
"Collector's",
26+
"Decorated Weapon",
27+
]
28+
29+
EFFECT_NAMES = [i for i in EFFECTS.keys() if not i.isnumeric()]
30+
31+
32+
def has_festivized_in_name(name: str) -> bool:
33+
return "Festivized " in name
34+
35+
36+
def has_uncraftable_in_name(name: str) -> bool:
37+
return "Uncraftable " in name
38+
39+
40+
def has_non_craftable_in_name(name: str) -> bool:
41+
return "Non-Craftable " in name
42+
43+
44+
def is_craftable(name: str) -> bool:
45+
return not (has_uncraftable_in_name(name) or has_non_craftable_in_name(name))
46+
47+
48+
def has_australium_in_name(name: str) -> bool:
49+
return "Australium " in name
50+
51+
52+
def has_strange_in_name(name: str) -> bool:
53+
return "Strange " in name
54+
55+
56+
def has_basic_killstreak_in_name(name: str) -> bool:
57+
return name.startswith("Basic Killstreak ")
58+
59+
60+
def has_specialized_killstreak_in_name(name: str) -> bool:
61+
return name.startswith("Specialized ")
62+
63+
64+
def has_professional_killstreak_in_name(name: str) -> bool:
65+
return name.startswith("Professional ")
66+
67+
68+
def has_killstreak_in_name(name: str) -> bool:
69+
return (
70+
has_basic_killstreak_in_name(name)
71+
or has_specialized_killstreak_in_name(name)
72+
or has_professional_killstreak_in_name(name)
73+
)
74+
75+
76+
def get_effect_in_name(name: str) -> int:
77+
for effect in EFFECT_NAMES:
78+
if effect in name:
79+
return EFFECTS[effect]
80+
81+
return -1
82+
83+
84+
def get_quality_from_name(name: str) -> int:
85+
quality = 6
86+
87+
for part in name.split(" "):
88+
if part not in QUALITY_NAMES:
89+
continue
90+
91+
quality = QUALITIES[part]
92+
break
93+
94+
return quality

src/tf2_utils/schema.py

Lines changed: 107 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
1-
from tf2_data import EFFECTS, KILLSTREAKS, QUALITIES, SchemaItems
1+
from tf2_data import SchemaItems
22
from tf2_sku import to_sku
33

4+
from .item_name import (
5+
get_effect_in_name,
6+
get_quality_from_name,
7+
has_australium_in_name,
8+
has_basic_killstreak_in_name,
9+
has_festivized_in_name,
10+
has_professional_killstreak_in_name,
11+
has_specialized_killstreak_in_name,
12+
has_strange_in_name,
13+
is_craftable,
14+
)
415
from .sku import (
5-
get_sku_effect,
6-
get_sku_killstreak,
16+
australium_in_sku,
17+
festive_in_sku,
18+
get_effect_name_from_sku,
19+
get_killstreak_name_from_sku,
720
sku_is_uncraftable,
821
sku_to_defindex,
922
sku_to_quality_name,
@@ -32,7 +45,7 @@ def defindex_to_full_name(self, defindex: int) -> str:
3245

3346
return self.defindex_full_names.get(str(defindex), "")
3447

35-
def name_to_defindex(self, name: str) -> int:
48+
def name_to_defindex(self, name: str, index: int = 0) -> int:
3649
if name == "Random Craft Weapon":
3750
return -50
3851

@@ -57,9 +70,11 @@ def name_to_defindex(self, name: str) -> int:
5770
if name == "Name Tag":
5871
return defindexes[last_index]
5972

60-
return defindexes[0]
73+
print(index)
74+
print(defindexes)
75+
return defindexes[index]
6176

62-
def defindex_to_image_url(self, defindex: int, large: bool = False) -> str:
77+
def defindex_to_image_url(self, defindex: int, large_image: bool = False) -> str:
6378
# random craft weapon => shotgun
6479
if defindex == -50:
6580
defindex = 9
@@ -72,42 +87,28 @@ def defindex_to_image_url(self, defindex: int, large: bool = False) -> str:
7287
if item["defindex"] != defindex:
7388
continue
7489

75-
return item["image_url"] if not large else item["image_url_large"]
90+
return item["image_url_large"] if large_image else item["image_url"]
7691

7792
return ""
7893

79-
def sku_to_image_url(self, sku: str, large: bool = False) -> str:
94+
def sku_to_image_url(self, sku: str, large_image: bool = False) -> str:
8095
defindex = sku_to_defindex(sku)
81-
return self.defindex_to_image_url(defindex, large)
82-
83-
def name_to_sku(self, name: str) -> str:
84-
"""This is not accurate, be careful when using this."""
85-
parts = name.split(" ")
86-
87-
defindex = -1
88-
craftable = True
89-
quality = 6
96+
return self.defindex_to_image_url(defindex, large_image)
9097

91-
for part in parts:
92-
if part in ["Uncraftable", "Non-Craftable"]:
93-
craftable = False
94-
95-
if part in QUALITIES:
96-
quality = QUALITIES[part]
98+
def get_defindex_from_name(self, name: str, entry_index: int = 0) -> int:
99+
# try whole name, then remove everything till the
100+
# first space for each iteration if defindex
101+
# for that name doesnt exist
97102

103+
# example:
104+
# Uncraftable Strange Team Captain => -1
105+
# Strange Team Captain => -1
106+
# Team Captain => 378 != -1, so break
98107
defindex_name = name
108+
defindex = -1
99109

100110
while True:
101-
# try whole name, then remove everything till the
102-
# first space for each iteration if defindex
103-
# for that name doesnt exist
104-
105-
# example:
106-
# Uncraftable Strange Team Captain => -1
107-
# Strange Team Captain => -1
108-
# Team Captain => 378 != -1, so break
109-
110-
defindex = self.name_to_defindex(defindex_name)
111+
defindex = self.name_to_defindex(defindex_name, entry_index)
111112

112113
if defindex != -1:
113114
break
@@ -119,10 +120,46 @@ def name_to_sku(self, name: str) -> str:
119120

120121
defindex_name = defindex_name[index + 1 :]
121122

123+
return defindex
124+
125+
def name_to_sku(self, name: str) -> str:
126+
quality = get_quality_from_name(name)
127+
defindex = self.get_defindex_from_name(name)
128+
effect = get_effect_in_name(name)
129+
is_australium = False
130+
killstreak_tier = -1
131+
132+
if effect != -1:
133+
quality = 5
134+
135+
if has_professional_killstreak_in_name(name):
136+
killstreak_tier = 3
137+
138+
if has_specialized_killstreak_in_name(name):
139+
killstreak_tier = 2
140+
141+
if has_basic_killstreak_in_name(name):
142+
killstreak_tier = 1
143+
144+
# must be strange to be australium
145+
if "Australium Gold" not in name and has_australium_in_name(name):
146+
quality = 11
147+
is_australium = True
148+
149+
# australium weapons are the second entry in the defindex list, need to
150+
# get the defindex again
151+
if is_australium:
152+
defindex = self.get_defindex_from_name(name, 1)
153+
122154
sku_properties = {
123155
"defindex": defindex,
124156
"quality": quality,
125-
"craftable": craftable,
157+
"effect": effect,
158+
"strange": has_strange_in_name(name) and quality != 11,
159+
"festivized": has_festivized_in_name(name),
160+
"craftable": is_craftable(name),
161+
"killstreak_tier": killstreak_tier,
162+
"australium": is_australium,
126163
}
127164

128165
return to_sku(sku_properties)
@@ -135,49 +172,54 @@ def sku_to_full_name(self, sku: str) -> str:
135172
defindex = sku_to_defindex(sku)
136173
return self.defindex_to_full_name(defindex)
137174

138-
def sku_to_name(self, sku: str, use_uncraftable: bool = True) -> str:
175+
def format_name(
176+
self,
177+
item_name: str,
178+
quality: str = "",
179+
craftable: str = "",
180+
effect: str = "",
181+
killstreak: str = "",
182+
strange: str = "",
183+
festivized: str = "",
184+
) -> str:
185+
return "".join(
186+
[killstreak, strange, effect, craftable, quality, festivized, item_name]
187+
)
188+
189+
def sku_to_name(self, sku: str, as_uncraftable: bool = True) -> str:
139190
name = self.sku_to_base_name(sku)
140-
craftable = ""
141191
quality = sku_to_quality_name(sku)
142-
effect = get_sku_effect(sku)
143-
killstreak = get_sku_killstreak(sku)
144-
strange = strange_in_sku(sku)
192+
craftable = ""
193+
festivized = "Festivized " if festive_in_sku(sku) else ""
194+
effect = get_effect_name_from_sku(sku)
195+
killstreak = get_killstreak_name_from_sku(sku)
196+
is_australium = australium_in_sku(sku)
197+
strange = ""
198+
199+
if strange_in_sku(sku):
200+
strange = "Strange "
145201

146202
if quality not in ["Unusual", "Unique"]:
147203
quality += " "
148204
else:
149205
quality = ""
150206

151-
if effect != -1:
152-
effect = EFFECTS[str(effect)] + " "
153-
else:
154-
effect = ""
155-
156-
if killstreak != -1:
157-
killstreak = KILLSTREAKS[str(killstreak)] + " "
158-
else:
159-
killstreak = ""
160-
161-
if strange:
162-
strange = "Strange "
163-
else:
164-
strange = ""
207+
if is_australium:
208+
quality = ""
209+
name = "Australium " + name
165210

166211
if sku_is_uncraftable(sku):
167-
if use_uncraftable:
212+
if as_uncraftable:
168213
craftable = "Uncraftable "
169214
else:
170215
craftable = "Non-Craftable "
171216

172-
festive = ""
173-
festivized = ""
174-
wear = ""
175-
176-
# TODO: add killstreaks and other properties (strange unusual etc.)
177-
# festive
178-
# festivzed
179-
# wear
180-
181-
return "".join(
182-
[killstreak, strange, festive, festivized, craftable, quality, name, wear]
217+
return self.format_name(
218+
name,
219+
quality=quality,
220+
craftable=craftable,
221+
effect=effect,
222+
killstreak=killstreak,
223+
strange=strange,
224+
festivized=festivized,
183225
)

0 commit comments

Comments
 (0)