This commit is contained in:
secret-rare
2026-03-07 18:42:12 +00:00
parent 8469d0e9e2
commit 9df3996791
2 changed files with 237 additions and 110 deletions
+236 -109
View File
@@ -41,6 +41,9 @@
<li>
<a class="function" href="#RobloxClient.batch_upload">batch_upload</a>
</li>
<li>
<a class="function" href="#RobloxClient.publish_collectible">publish_collectible</a>
</li>
<li>
<a class="function" href="#RobloxClient.onsale_asset">onsale_asset</a>
</li>
@@ -490,65 +493,118 @@ rbx_upload </h1>
</span><span id="RobloxClient-254"><a href="#RobloxClient-254"><span class="linenos">254</span></a> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">_upload_one</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span><span class="p">])</span>
</span><span id="RobloxClient-255"><a href="#RobloxClient-255"><span class="linenos">255</span></a> <span class="k">return</span> <span class="n">result</span>
</span><span id="RobloxClient-256"><a href="#RobloxClient-256"><span class="linenos">256</span></a>
</span><span id="RobloxClient-257"><a href="#RobloxClient-257"><span class="linenos">257</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">onsale_asset</span><span class="p">(</span>
</span><span id="RobloxClient-257"><a href="#RobloxClient-257"><span class="linenos">257</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">publish_collectible</span><span class="p">(</span>
</span><span id="RobloxClient-258"><a href="#RobloxClient-258"><span class="linenos">258</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="RobloxClient-259"><a href="#RobloxClient-259"><span class="linenos">259</span></a> <span class="n">collectible_item_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient-260"><a href="#RobloxClient-260"><span class="linenos">260</span></a> <span class="n">price</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
</span><span id="RobloxClient-261"><a href="#RobloxClient-261"><span class="linenos">261</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="RobloxClient-262"><a href="#RobloxClient-262"><span class="linenos">262</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Put an asset on sale.&quot;&quot;&quot;</span>
</span><span id="RobloxClient-263"><a href="#RobloxClient-263"><span class="linenos">263</span></a> <span class="n">csrf</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_csrf_token</span><span class="p">()</span>
</span><span id="RobloxClient-264"><a href="#RobloxClient-264"><span class="linenos">264</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
</span><span id="RobloxClient-265"><a href="#RobloxClient-265"><span class="linenos">265</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/</span><span class="si">{</span><span class="n">collectible_item_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-266"><a href="#RobloxClient-266"><span class="linenos">266</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient-267"><a href="#RobloxClient-267"><span class="linenos">267</span></a> <span class="s2">&quot;saleLocationConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;saleLocationType&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;places&quot;</span><span class="p">:</span> <span class="p">[]},</span>
</span><span id="RobloxClient-268"><a href="#RobloxClient-268"><span class="linenos">268</span></a> <span class="s2">&quot;saleStatus&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-269"><a href="#RobloxClient-269"><span class="linenos">269</span></a> <span class="s2">&quot;quantityLimitPerUser&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-270"><a href="#RobloxClient-270"><span class="linenos">270</span></a> <span class="s2">&quot;resaleRestriction&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient-271"><a href="#RobloxClient-271"><span class="linenos">271</span></a> <span class="s2">&quot;priceInRobux&quot;</span><span class="p">:</span> <span class="n">price</span><span class="p">,</span>
</span><span id="RobloxClient-272"><a href="#RobloxClient-272"><span class="linenos">272</span></a> <span class="s2">&quot;priceOffset&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-273"><a href="#RobloxClient-273"><span class="linenos">273</span></a> <span class="s2">&quot;optOutFromRegionalPricing&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient-274"><a href="#RobloxClient-274"><span class="linenos">274</span></a> <span class="s2">&quot;isFree&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient-275"><a href="#RobloxClient-275"><span class="linenos">275</span></a> <span class="p">},</span>
</span><span id="RobloxClient-276"><a href="#RobloxClient-276"><span class="linenos">276</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient-277"><a href="#RobloxClient-277"><span class="linenos">277</span></a> <span class="s2">&quot;X-CSRF-TOKEN&quot;</span><span class="p">:</span> <span class="n">csrf</span><span class="p">,</span>
</span><span id="RobloxClient-278"><a href="#RobloxClient-278"><span class="linenos">278</span></a> <span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-279"><a href="#RobloxClient-279"><span class="linenos">279</span></a> <span class="s2">&quot;Referer&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com/&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-280"><a href="#RobloxClient-280"><span class="linenos">280</span></a> <span class="s2">&quot;Origin&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-281"><a href="#RobloxClient-281"><span class="linenos">281</span></a> <span class="p">},</span>
</span><span id="RobloxClient-282"><a href="#RobloxClient-282"><span class="linenos">282</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient-283"><a href="#RobloxClient-283"><span class="linenos">283</span></a> <span class="p">)</span>
</span><span id="RobloxClient-284"><a href="#RobloxClient-284"><span class="linenos">284</span></a>
</span><span id="RobloxClient-285"><a href="#RobloxClient-285"><span class="linenos">285</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">429</span><span class="p">:</span>
</span><span id="RobloxClient-286"><a href="#RobloxClient-286"><span class="linenos">286</span></a> <span class="k">raise</span> <span class="n">RateLimitError</span><span class="p">(</span><span class="s2">&quot;Rate limit hit during onsale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-287"><a href="#RobloxClient-287"><span class="linenos">287</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">401</span><span class="p">,</span> <span class="mi">403</span><span class="p">):</span>
</span><span id="RobloxClient-288"><a href="#RobloxClient-288"><span class="linenos">288</span></a> <span class="k">raise</span> <span class="n">AuthError</span><span class="p">(</span><span class="s2">&quot;Not authorized to put this asset on sale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-289"><a href="#RobloxClient-289"><span class="linenos">289</span></a>
</span><span id="RobloxClient-290"><a href="#RobloxClient-290"><span class="linenos">290</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient-291"><a href="#RobloxClient-291"><span class="linenos">291</span></a> <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="RobloxClient-292"><a href="#RobloxClient-292"><span class="linenos">292</span></a>
</span><span id="RobloxClient-293"><a href="#RobloxClient-293"><span class="linenos">293</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_collectible_item_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asset_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">max_attempts</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">poll_interval</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">3.0</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="RobloxClient-294"><a href="#RobloxClient-294"><span class="linenos">294</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Look up the collectible item ID (UUID) for a given asset ID, retrying until available.&quot;&quot;&quot;</span>
</span><span id="RobloxClient-295"><a href="#RobloxClient-295"><span class="linenos">295</span></a> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_attempts</span><span class="p">):</span>
</span><span id="RobloxClient-296"><a href="#RobloxClient-296"><span class="linenos">296</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="RobloxClient-297"><a href="#RobloxClient-297"><span class="linenos">297</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/0/</span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-298"><a href="#RobloxClient-298"><span class="linenos">298</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient-299"><a href="#RobloxClient-299"><span class="linenos">299</span></a> <span class="p">)</span>
</span><span id="RobloxClient-300"><a href="#RobloxClient-300"><span class="linenos">300</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient-301"><a href="#RobloxClient-301"><span class="linenos">301</span></a> <span class="n">collectible_item_id</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;collectibleItemId&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-302"><a href="#RobloxClient-302"><span class="linenos">302</span></a> <span class="k">if</span> <span class="n">collectible_item_id</span><span class="p">:</span>
</span><span id="RobloxClient-303"><a href="#RobloxClient-303"><span class="linenos">303</span></a> <span class="k">return</span> <span class="n">collectible_item_id</span>
</span><span id="RobloxClient-304"><a href="#RobloxClient-304"><span class="linenos">304</span></a> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">poll_interval</span><span class="p">)</span>
</span><span id="RobloxClient-305"><a href="#RobloxClient-305"><span class="linenos">305</span></a> <span class="k">raise</span> <span class="n">UploadError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;collectibleItemId not available for asset </span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2"> after </span><span class="si">{</span><span class="n">max_attempts</span><span class="si">}</span><span class="s2"> attempts.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-306"><a href="#RobloxClient-306"><span class="linenos">306</span></a>
</span><span id="RobloxClient-307"><a href="#RobloxClient-307"><span class="linenos">307</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="RobloxClient-308"><a href="#RobloxClient-308"><span class="linenos">308</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Close the underlying HTTP client.&quot;&quot;&quot;</span>
</span><span id="RobloxClient-309"><a href="#RobloxClient-309"><span class="linenos">309</span></a> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">aclose</span><span class="p">()</span>
</span><span id="RobloxClient-310"><a href="#RobloxClient-310"><span class="linenos">310</span></a>
</span><span id="RobloxClient-311"><a href="#RobloxClient-311"><span class="linenos">311</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="fm">__aenter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="RobloxClient-312"><a href="#RobloxClient-312"><span class="linenos">312</span></a> <span class="k">return</span> <span class="bp">self</span>
</span><span id="RobloxClient-313"><a href="#RobloxClient-313"><span class="linenos">313</span></a>
</span><span id="RobloxClient-314"><a href="#RobloxClient-314"><span class="linenos">314</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="fm">__aexit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
</span><span id="RobloxClient-315"><a href="#RobloxClient-315"><span class="linenos">315</span></a> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span><span id="RobloxClient-259"><a href="#RobloxClient-259"><span class="linenos">259</span></a> <span class="n">asset_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span><span id="RobloxClient-260"><a href="#RobloxClient-260"><span class="linenos">260</span></a> <span class="n">group_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span><span id="RobloxClient-261"><a href="#RobloxClient-261"><span class="linenos">261</span></a> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient-262"><a href="#RobloxClient-262"><span class="linenos">262</span></a> <span class="n">description</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient-263"><a href="#RobloxClient-263"><span class="linenos">263</span></a> <span class="n">price</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
</span><span id="RobloxClient-264"><a href="#RobloxClient-264"><span class="linenos">264</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="RobloxClient-265"><a href="#RobloxClient-265"><span class="linenos">265</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Publish an asset as a Limited collectible. Returns the collectibleItemId.&quot;&quot;&quot;</span>
</span><span id="RobloxClient-266"><a href="#RobloxClient-266"><span class="linenos">266</span></a> <span class="n">csrf</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_csrf_token</span><span class="p">()</span>
</span><span id="RobloxClient-267"><a href="#RobloxClient-267"><span class="linenos">267</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="RobloxClient-268"><a href="#RobloxClient-268"><span class="linenos">268</span></a> <span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-269"><a href="#RobloxClient-269"><span class="linenos">269</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient-270"><a href="#RobloxClient-270"><span class="linenos">270</span></a> <span class="s2">&quot;isRentalOptIn&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient-271"><a href="#RobloxClient-271"><span class="linenos">271</span></a> <span class="s2">&quot;idempotencyToken&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()),</span>
</span><span id="RobloxClient-272"><a href="#RobloxClient-272"><span class="linenos">272</span></a> <span class="s2">&quot;targetId&quot;</span><span class="p">:</span> <span class="n">asset_id</span><span class="p">,</span>
</span><span id="RobloxClient-273"><a href="#RobloxClient-273"><span class="linenos">273</span></a> <span class="s2">&quot;targetType&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-274"><a href="#RobloxClient-274"><span class="linenos">274</span></a> <span class="s2">&quot;publishingType&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient-275"><a href="#RobloxClient-275"><span class="linenos">275</span></a> <span class="s2">&quot;agreedPublishingFee&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
</span><span id="RobloxClient-276"><a href="#RobloxClient-276"><span class="linenos">276</span></a> <span class="s2">&quot;creatorGroupId&quot;</span><span class="p">:</span> <span class="n">group_id</span><span class="p">,</span>
</span><span id="RobloxClient-277"><a href="#RobloxClient-277"><span class="linenos">277</span></a> <span class="s2">&quot;publisherUserId&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_publisher_user_id</span><span class="p">,</span>
</span><span id="RobloxClient-278"><a href="#RobloxClient-278"><span class="linenos">278</span></a> <span class="s2">&quot;quantity&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-279"><a href="#RobloxClient-279"><span class="linenos">279</span></a> <span class="s2">&quot;quantityLimitPerUser&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-280"><a href="#RobloxClient-280"><span class="linenos">280</span></a> <span class="s2">&quot;resaleRestriction&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient-281"><a href="#RobloxClient-281"><span class="linenos">281</span></a> <span class="s2">&quot;priceInRobux&quot;</span><span class="p">:</span> <span class="n">price</span><span class="p">,</span>
</span><span id="RobloxClient-282"><a href="#RobloxClient-282"><span class="linenos">282</span></a> <span class="s2">&quot;priceOffset&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-283"><a href="#RobloxClient-283"><span class="linenos">283</span></a> <span class="s2">&quot;optOutFromRegionalPricing&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient-284"><a href="#RobloxClient-284"><span class="linenos">284</span></a> <span class="s2">&quot;isFree&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient-285"><a href="#RobloxClient-285"><span class="linenos">285</span></a> <span class="s2">&quot;saleLocationConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;saleLocationType&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;places&quot;</span><span class="p">:</span> <span class="p">[]},</span>
</span><span id="RobloxClient-286"><a href="#RobloxClient-286"><span class="linenos">286</span></a> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span>
</span><span id="RobloxClient-287"><a href="#RobloxClient-287"><span class="linenos">287</span></a> <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="n">description</span><span class="p">,</span>
</span><span id="RobloxClient-288"><a href="#RobloxClient-288"><span class="linenos">288</span></a> <span class="p">},</span>
</span><span id="RobloxClient-289"><a href="#RobloxClient-289"><span class="linenos">289</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient-290"><a href="#RobloxClient-290"><span class="linenos">290</span></a> <span class="s2">&quot;X-CSRF-TOKEN&quot;</span><span class="p">:</span> <span class="n">csrf</span><span class="p">,</span>
</span><span id="RobloxClient-291"><a href="#RobloxClient-291"><span class="linenos">291</span></a> <span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-292"><a href="#RobloxClient-292"><span class="linenos">292</span></a> <span class="s2">&quot;Referer&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com/&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-293"><a href="#RobloxClient-293"><span class="linenos">293</span></a> <span class="s2">&quot;Origin&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-294"><a href="#RobloxClient-294"><span class="linenos">294</span></a> <span class="p">},</span>
</span><span id="RobloxClient-295"><a href="#RobloxClient-295"><span class="linenos">295</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient-296"><a href="#RobloxClient-296"><span class="linenos">296</span></a> <span class="p">)</span>
</span><span id="RobloxClient-297"><a href="#RobloxClient-297"><span class="linenos">297</span></a>
</span><span id="RobloxClient-298"><a href="#RobloxClient-298"><span class="linenos">298</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">429</span><span class="p">:</span>
</span><span id="RobloxClient-299"><a href="#RobloxClient-299"><span class="linenos">299</span></a> <span class="k">raise</span> <span class="n">RateLimitError</span><span class="p">(</span><span class="s2">&quot;Rate limit hit during collectible publish.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-300"><a href="#RobloxClient-300"><span class="linenos">300</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">401</span><span class="p">,</span> <span class="mi">403</span><span class="p">):</span>
</span><span id="RobloxClient-301"><a href="#RobloxClient-301"><span class="linenos">301</span></a> <span class="k">raise</span> <span class="n">AuthError</span><span class="p">(</span><span class="s2">&quot;Not authorized to publish this collectible.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-302"><a href="#RobloxClient-302"><span class="linenos">302</span></a>
</span><span id="RobloxClient-303"><a href="#RobloxClient-303"><span class="linenos">303</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient-304"><a href="#RobloxClient-304"><span class="linenos">304</span></a> <span class="n">data</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="RobloxClient-305"><a href="#RobloxClient-305"><span class="linenos">305</span></a> <span class="n">collectible_item_id</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;collectibleItemId&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-306"><a href="#RobloxClient-306"><span class="linenos">306</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">collectible_item_id</span><span class="p">:</span>
</span><span id="RobloxClient-307"><a href="#RobloxClient-307"><span class="linenos">307</span></a> <span class="k">raise</span> <span class="n">UploadError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;publish_collectible did not return a collectibleItemId: </span><span class="si">{</span><span class="n">data</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-308"><a href="#RobloxClient-308"><span class="linenos">308</span></a> <span class="k">return</span> <span class="n">collectible_item_id</span>
</span><span id="RobloxClient-309"><a href="#RobloxClient-309"><span class="linenos">309</span></a>
</span><span id="RobloxClient-310"><a href="#RobloxClient-310"><span class="linenos">310</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">onsale_asset</span><span class="p">(</span>
</span><span id="RobloxClient-311"><a href="#RobloxClient-311"><span class="linenos">311</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="RobloxClient-312"><a href="#RobloxClient-312"><span class="linenos">312</span></a> <span class="n">collectible_item_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient-313"><a href="#RobloxClient-313"><span class="linenos">313</span></a> <span class="n">price</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
</span><span id="RobloxClient-314"><a href="#RobloxClient-314"><span class="linenos">314</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="RobloxClient-315"><a href="#RobloxClient-315"><span class="linenos">315</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Put an asset on sale.&quot;&quot;&quot;</span>
</span><span id="RobloxClient-316"><a href="#RobloxClient-316"><span class="linenos">316</span></a> <span class="n">csrf</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_csrf_token</span><span class="p">()</span>
</span><span id="RobloxClient-317"><a href="#RobloxClient-317"><span class="linenos">317</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
</span><span id="RobloxClient-318"><a href="#RobloxClient-318"><span class="linenos">318</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/</span><span class="si">{</span><span class="n">collectible_item_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-319"><a href="#RobloxClient-319"><span class="linenos">319</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient-320"><a href="#RobloxClient-320"><span class="linenos">320</span></a> <span class="s2">&quot;saleLocationConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;saleLocationType&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;places&quot;</span><span class="p">:</span> <span class="p">[]},</span>
</span><span id="RobloxClient-321"><a href="#RobloxClient-321"><span class="linenos">321</span></a> <span class="s2">&quot;saleStatus&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-322"><a href="#RobloxClient-322"><span class="linenos">322</span></a> <span class="s2">&quot;quantityLimitPerUser&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-323"><a href="#RobloxClient-323"><span class="linenos">323</span></a> <span class="s2">&quot;resaleRestriction&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient-324"><a href="#RobloxClient-324"><span class="linenos">324</span></a> <span class="s2">&quot;priceInRobux&quot;</span><span class="p">:</span> <span class="n">price</span><span class="p">,</span>
</span><span id="RobloxClient-325"><a href="#RobloxClient-325"><span class="linenos">325</span></a> <span class="s2">&quot;priceOffset&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient-326"><a href="#RobloxClient-326"><span class="linenos">326</span></a> <span class="s2">&quot;optOutFromRegionalPricing&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient-327"><a href="#RobloxClient-327"><span class="linenos">327</span></a> <span class="s2">&quot;isFree&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient-328"><a href="#RobloxClient-328"><span class="linenos">328</span></a> <span class="p">},</span>
</span><span id="RobloxClient-329"><a href="#RobloxClient-329"><span class="linenos">329</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient-330"><a href="#RobloxClient-330"><span class="linenos">330</span></a> <span class="s2">&quot;X-CSRF-TOKEN&quot;</span><span class="p">:</span> <span class="n">csrf</span><span class="p">,</span>
</span><span id="RobloxClient-331"><a href="#RobloxClient-331"><span class="linenos">331</span></a> <span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-332"><a href="#RobloxClient-332"><span class="linenos">332</span></a> <span class="s2">&quot;Referer&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com/&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-333"><a href="#RobloxClient-333"><span class="linenos">333</span></a> <span class="s2">&quot;Origin&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-334"><a href="#RobloxClient-334"><span class="linenos">334</span></a> <span class="p">},</span>
</span><span id="RobloxClient-335"><a href="#RobloxClient-335"><span class="linenos">335</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient-336"><a href="#RobloxClient-336"><span class="linenos">336</span></a> <span class="p">)</span>
</span><span id="RobloxClient-337"><a href="#RobloxClient-337"><span class="linenos">337</span></a>
</span><span id="RobloxClient-338"><a href="#RobloxClient-338"><span class="linenos">338</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">429</span><span class="p">:</span>
</span><span id="RobloxClient-339"><a href="#RobloxClient-339"><span class="linenos">339</span></a> <span class="k">raise</span> <span class="n">RateLimitError</span><span class="p">(</span><span class="s2">&quot;Rate limit hit during onsale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-340"><a href="#RobloxClient-340"><span class="linenos">340</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">401</span><span class="p">,</span> <span class="mi">403</span><span class="p">):</span>
</span><span id="RobloxClient-341"><a href="#RobloxClient-341"><span class="linenos">341</span></a> <span class="k">raise</span> <span class="n">AuthError</span><span class="p">(</span><span class="s2">&quot;Not authorized to put this asset on sale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-342"><a href="#RobloxClient-342"><span class="linenos">342</span></a>
</span><span id="RobloxClient-343"><a href="#RobloxClient-343"><span class="linenos">343</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient-344"><a href="#RobloxClient-344"><span class="linenos">344</span></a> <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="RobloxClient-345"><a href="#RobloxClient-345"><span class="linenos">345</span></a>
</span><span id="RobloxClient-346"><a href="#RobloxClient-346"><span class="linenos">346</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_collectible_item_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asset_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">max_attempts</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">poll_interval</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">3.0</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="RobloxClient-347"><a href="#RobloxClient-347"><span class="linenos">347</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Look up the collectible item ID (UUID) for a given asset ID, retrying until available.&quot;&quot;&quot;</span>
</span><span id="RobloxClient-348"><a href="#RobloxClient-348"><span class="linenos">348</span></a> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_attempts</span><span class="p">):</span>
</span><span id="RobloxClient-349"><a href="#RobloxClient-349"><span class="linenos">349</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="RobloxClient-350"><a href="#RobloxClient-350"><span class="linenos">350</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/0/</span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient-351"><a href="#RobloxClient-351"><span class="linenos">351</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient-352"><a href="#RobloxClient-352"><span class="linenos">352</span></a> <span class="p">)</span>
</span><span id="RobloxClient-353"><a href="#RobloxClient-353"><span class="linenos">353</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient-354"><a href="#RobloxClient-354"><span class="linenos">354</span></a> <span class="n">collectible_item_id</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;collectibleItemId&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-355"><a href="#RobloxClient-355"><span class="linenos">355</span></a> <span class="k">if</span> <span class="n">collectible_item_id</span><span class="p">:</span>
</span><span id="RobloxClient-356"><a href="#RobloxClient-356"><span class="linenos">356</span></a> <span class="k">return</span> <span class="n">collectible_item_id</span>
</span><span id="RobloxClient-357"><a href="#RobloxClient-357"><span class="linenos">357</span></a> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">poll_interval</span><span class="p">)</span>
</span><span id="RobloxClient-358"><a href="#RobloxClient-358"><span class="linenos">358</span></a> <span class="k">raise</span> <span class="n">UploadError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;collectibleItemId not available for asset </span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2"> after </span><span class="si">{</span><span class="n">max_attempts</span><span class="si">}</span><span class="s2"> attempts.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient-359"><a href="#RobloxClient-359"><span class="linenos">359</span></a>
</span><span id="RobloxClient-360"><a href="#RobloxClient-360"><span class="linenos">360</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="RobloxClient-361"><a href="#RobloxClient-361"><span class="linenos">361</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Close the underlying HTTP client.&quot;&quot;&quot;</span>
</span><span id="RobloxClient-362"><a href="#RobloxClient-362"><span class="linenos">362</span></a> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">aclose</span><span class="p">()</span>
</span><span id="RobloxClient-363"><a href="#RobloxClient-363"><span class="linenos">363</span></a>
</span><span id="RobloxClient-364"><a href="#RobloxClient-364"><span class="linenos">364</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="fm">__aenter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="RobloxClient-365"><a href="#RobloxClient-365"><span class="linenos">365</span></a> <span class="k">return</span> <span class="bp">self</span>
</span><span id="RobloxClient-366"><a href="#RobloxClient-366"><span class="linenos">366</span></a>
</span><span id="RobloxClient-367"><a href="#RobloxClient-367"><span class="linenos">367</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="fm">__aexit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
</span><span id="RobloxClient-368"><a href="#RobloxClient-368"><span class="linenos">368</span></a> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></pre></div>
@@ -843,6 +899,77 @@ failures in the returned BatchResult.</p>
</div>
</div>
<div id="RobloxClient.publish_collectible" class="classattr">
<input id="RobloxClient.publish_collectible-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">async def</span>
<span class="name">publish_collectible</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">asset_id</span><span class="p">:</span> <span class="nb">int</span>,</span><span class="param"> <span class="n">group_id</span><span class="p">:</span> <span class="nb">int</span>,</span><span class="param"> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">description</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">price</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span></span><span class="return-annotation">) -> <span class="nb">str</span>:</span></span>
<label class="view-source-button" for="RobloxClient.publish_collectible-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#RobloxClient.publish_collectible"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="RobloxClient.publish_collectible-257"><a href="#RobloxClient.publish_collectible-257"><span class="linenos">257</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">publish_collectible</span><span class="p">(</span>
</span><span id="RobloxClient.publish_collectible-258"><a href="#RobloxClient.publish_collectible-258"><span class="linenos">258</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-259"><a href="#RobloxClient.publish_collectible-259"><span class="linenos">259</span></a> <span class="n">asset_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-260"><a href="#RobloxClient.publish_collectible-260"><span class="linenos">260</span></a> <span class="n">group_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-261"><a href="#RobloxClient.publish_collectible-261"><span class="linenos">261</span></a> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-262"><a href="#RobloxClient.publish_collectible-262"><span class="linenos">262</span></a> <span class="n">description</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-263"><a href="#RobloxClient.publish_collectible-263"><span class="linenos">263</span></a> <span class="n">price</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-264"><a href="#RobloxClient.publish_collectible-264"><span class="linenos">264</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="RobloxClient.publish_collectible-265"><a href="#RobloxClient.publish_collectible-265"><span class="linenos">265</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Publish an asset as a Limited collectible. Returns the collectibleItemId.&quot;&quot;&quot;</span>
</span><span id="RobloxClient.publish_collectible-266"><a href="#RobloxClient.publish_collectible-266"><span class="linenos">266</span></a> <span class="n">csrf</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_csrf_token</span><span class="p">()</span>
</span><span id="RobloxClient.publish_collectible-267"><a href="#RobloxClient.publish_collectible-267"><span class="linenos">267</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span>
</span><span id="RobloxClient.publish_collectible-268"><a href="#RobloxClient.publish_collectible-268"><span class="linenos">268</span></a> <span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-269"><a href="#RobloxClient.publish_collectible-269"><span class="linenos">269</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient.publish_collectible-270"><a href="#RobloxClient.publish_collectible-270"><span class="linenos">270</span></a> <span class="s2">&quot;isRentalOptIn&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-271"><a href="#RobloxClient.publish_collectible-271"><span class="linenos">271</span></a> <span class="s2">&quot;idempotencyToken&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()),</span>
</span><span id="RobloxClient.publish_collectible-272"><a href="#RobloxClient.publish_collectible-272"><span class="linenos">272</span></a> <span class="s2">&quot;targetId&quot;</span><span class="p">:</span> <span class="n">asset_id</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-273"><a href="#RobloxClient.publish_collectible-273"><span class="linenos">273</span></a> <span class="s2">&quot;targetType&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-274"><a href="#RobloxClient.publish_collectible-274"><span class="linenos">274</span></a> <span class="s2">&quot;publishingType&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-275"><a href="#RobloxClient.publish_collectible-275"><span class="linenos">275</span></a> <span class="s2">&quot;agreedPublishingFee&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-276"><a href="#RobloxClient.publish_collectible-276"><span class="linenos">276</span></a> <span class="s2">&quot;creatorGroupId&quot;</span><span class="p">:</span> <span class="n">group_id</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-277"><a href="#RobloxClient.publish_collectible-277"><span class="linenos">277</span></a> <span class="s2">&quot;publisherUserId&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_publisher_user_id</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-278"><a href="#RobloxClient.publish_collectible-278"><span class="linenos">278</span></a> <span class="s2">&quot;quantity&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-279"><a href="#RobloxClient.publish_collectible-279"><span class="linenos">279</span></a> <span class="s2">&quot;quantityLimitPerUser&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-280"><a href="#RobloxClient.publish_collectible-280"><span class="linenos">280</span></a> <span class="s2">&quot;resaleRestriction&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-281"><a href="#RobloxClient.publish_collectible-281"><span class="linenos">281</span></a> <span class="s2">&quot;priceInRobux&quot;</span><span class="p">:</span> <span class="n">price</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-282"><a href="#RobloxClient.publish_collectible-282"><span class="linenos">282</span></a> <span class="s2">&quot;priceOffset&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-283"><a href="#RobloxClient.publish_collectible-283"><span class="linenos">283</span></a> <span class="s2">&quot;optOutFromRegionalPricing&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-284"><a href="#RobloxClient.publish_collectible-284"><span class="linenos">284</span></a> <span class="s2">&quot;isFree&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-285"><a href="#RobloxClient.publish_collectible-285"><span class="linenos">285</span></a> <span class="s2">&quot;saleLocationConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;saleLocationType&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;places&quot;</span><span class="p">:</span> <span class="p">[]},</span>
</span><span id="RobloxClient.publish_collectible-286"><a href="#RobloxClient.publish_collectible-286"><span class="linenos">286</span></a> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-287"><a href="#RobloxClient.publish_collectible-287"><span class="linenos">287</span></a> <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="n">description</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-288"><a href="#RobloxClient.publish_collectible-288"><span class="linenos">288</span></a> <span class="p">},</span>
</span><span id="RobloxClient.publish_collectible-289"><a href="#RobloxClient.publish_collectible-289"><span class="linenos">289</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient.publish_collectible-290"><a href="#RobloxClient.publish_collectible-290"><span class="linenos">290</span></a> <span class="s2">&quot;X-CSRF-TOKEN&quot;</span><span class="p">:</span> <span class="n">csrf</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-291"><a href="#RobloxClient.publish_collectible-291"><span class="linenos">291</span></a> <span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-292"><a href="#RobloxClient.publish_collectible-292"><span class="linenos">292</span></a> <span class="s2">&quot;Referer&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com/&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-293"><a href="#RobloxClient.publish_collectible-293"><span class="linenos">293</span></a> <span class="s2">&quot;Origin&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-294"><a href="#RobloxClient.publish_collectible-294"><span class="linenos">294</span></a> <span class="p">},</span>
</span><span id="RobloxClient.publish_collectible-295"><a href="#RobloxClient.publish_collectible-295"><span class="linenos">295</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient.publish_collectible-296"><a href="#RobloxClient.publish_collectible-296"><span class="linenos">296</span></a> <span class="p">)</span>
</span><span id="RobloxClient.publish_collectible-297"><a href="#RobloxClient.publish_collectible-297"><span class="linenos">297</span></a>
</span><span id="RobloxClient.publish_collectible-298"><a href="#RobloxClient.publish_collectible-298"><span class="linenos">298</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">429</span><span class="p">:</span>
</span><span id="RobloxClient.publish_collectible-299"><a href="#RobloxClient.publish_collectible-299"><span class="linenos">299</span></a> <span class="k">raise</span> <span class="n">RateLimitError</span><span class="p">(</span><span class="s2">&quot;Rate limit hit during collectible publish.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.publish_collectible-300"><a href="#RobloxClient.publish_collectible-300"><span class="linenos">300</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">401</span><span class="p">,</span> <span class="mi">403</span><span class="p">):</span>
</span><span id="RobloxClient.publish_collectible-301"><a href="#RobloxClient.publish_collectible-301"><span class="linenos">301</span></a> <span class="k">raise</span> <span class="n">AuthError</span><span class="p">(</span><span class="s2">&quot;Not authorized to publish this collectible.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.publish_collectible-302"><a href="#RobloxClient.publish_collectible-302"><span class="linenos">302</span></a>
</span><span id="RobloxClient.publish_collectible-303"><a href="#RobloxClient.publish_collectible-303"><span class="linenos">303</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient.publish_collectible-304"><a href="#RobloxClient.publish_collectible-304"><span class="linenos">304</span></a> <span class="n">data</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span><span id="RobloxClient.publish_collectible-305"><a href="#RobloxClient.publish_collectible-305"><span class="linenos">305</span></a> <span class="n">collectible_item_id</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;collectibleItemId&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.publish_collectible-306"><a href="#RobloxClient.publish_collectible-306"><span class="linenos">306</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">collectible_item_id</span><span class="p">:</span>
</span><span id="RobloxClient.publish_collectible-307"><a href="#RobloxClient.publish_collectible-307"><span class="linenos">307</span></a> <span class="k">raise</span> <span class="n">UploadError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;publish_collectible did not return a collectibleItemId: </span><span class="si">{</span><span class="n">data</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.publish_collectible-308"><a href="#RobloxClient.publish_collectible-308"><span class="linenos">308</span></a> <span class="k">return</span> <span class="n">collectible_item_id</span>
</span></pre></div>
<div class="docstring"><p>Publish an asset as a Limited collectible. Returns the collectibleItemId.</p>
</div>
</div>
<div id="RobloxClient.onsale_asset" class="classattr">
<input id="RobloxClient.onsale_asset-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
@@ -855,41 +982,41 @@ failures in the returned BatchResult.</p>
</div>
<a class="headerlink" href="#RobloxClient.onsale_asset"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="RobloxClient.onsale_asset-257"><a href="#RobloxClient.onsale_asset-257"><span class="linenos">257</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">onsale_asset</span><span class="p">(</span>
</span><span id="RobloxClient.onsale_asset-258"><a href="#RobloxClient.onsale_asset-258"><span class="linenos">258</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-259"><a href="#RobloxClient.onsale_asset-259"><span class="linenos">259</span></a> <span class="n">collectible_item_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-260"><a href="#RobloxClient.onsale_asset-260"><span class="linenos">260</span></a> <span class="n">price</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-261"><a href="#RobloxClient.onsale_asset-261"><span class="linenos">261</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="RobloxClient.onsale_asset-262"><a href="#RobloxClient.onsale_asset-262"><span class="linenos">262</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Put an asset on sale.&quot;&quot;&quot;</span>
</span><span id="RobloxClient.onsale_asset-263"><a href="#RobloxClient.onsale_asset-263"><span class="linenos">263</span></a> <span class="n">csrf</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_csrf_token</span><span class="p">()</span>
</span><span id="RobloxClient.onsale_asset-264"><a href="#RobloxClient.onsale_asset-264"><span class="linenos">264</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
</span><span id="RobloxClient.onsale_asset-265"><a href="#RobloxClient.onsale_asset-265"><span class="linenos">265</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/</span><span class="si">{</span><span class="n">collectible_item_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-266"><a href="#RobloxClient.onsale_asset-266"><span class="linenos">266</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient.onsale_asset-267"><a href="#RobloxClient.onsale_asset-267"><span class="linenos">267</span></a> <span class="s2">&quot;saleLocationConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;saleLocationType&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;places&quot;</span><span class="p">:</span> <span class="p">[]},</span>
</span><span id="RobloxClient.onsale_asset-268"><a href="#RobloxClient.onsale_asset-268"><span class="linenos">268</span></a> <span class="s2">&quot;saleStatus&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-269"><a href="#RobloxClient.onsale_asset-269"><span class="linenos">269</span></a> <span class="s2">&quot;quantityLimitPerUser&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-270"><a href="#RobloxClient.onsale_asset-270"><span class="linenos">270</span></a> <span class="s2">&quot;resaleRestriction&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-271"><a href="#RobloxClient.onsale_asset-271"><span class="linenos">271</span></a> <span class="s2">&quot;priceInRobux&quot;</span><span class="p">:</span> <span class="n">price</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-272"><a href="#RobloxClient.onsale_asset-272"><span class="linenos">272</span></a> <span class="s2">&quot;priceOffset&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-273"><a href="#RobloxClient.onsale_asset-273"><span class="linenos">273</span></a> <span class="s2">&quot;optOutFromRegionalPricing&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-274"><a href="#RobloxClient.onsale_asset-274"><span class="linenos">274</span></a> <span class="s2">&quot;isFree&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-275"><a href="#RobloxClient.onsale_asset-275"><span class="linenos">275</span></a> <span class="p">},</span>
</span><span id="RobloxClient.onsale_asset-276"><a href="#RobloxClient.onsale_asset-276"><span class="linenos">276</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient.onsale_asset-277"><a href="#RobloxClient.onsale_asset-277"><span class="linenos">277</span></a> <span class="s2">&quot;X-CSRF-TOKEN&quot;</span><span class="p">:</span> <span class="n">csrf</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-278"><a href="#RobloxClient.onsale_asset-278"><span class="linenos">278</span></a> <span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-279"><a href="#RobloxClient.onsale_asset-279"><span class="linenos">279</span></a> <span class="s2">&quot;Referer&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com/&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-280"><a href="#RobloxClient.onsale_asset-280"><span class="linenos">280</span></a> <span class="s2">&quot;Origin&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-281"><a href="#RobloxClient.onsale_asset-281"><span class="linenos">281</span></a> <span class="p">},</span>
</span><span id="RobloxClient.onsale_asset-282"><a href="#RobloxClient.onsale_asset-282"><span class="linenos">282</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-283"><a href="#RobloxClient.onsale_asset-283"><span class="linenos">283</span></a> <span class="p">)</span>
</span><span id="RobloxClient.onsale_asset-284"><a href="#RobloxClient.onsale_asset-284"><span class="linenos">284</span></a>
</span><span id="RobloxClient.onsale_asset-285"><a href="#RobloxClient.onsale_asset-285"><span class="linenos">285</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">429</span><span class="p">:</span>
</span><span id="RobloxClient.onsale_asset-286"><a href="#RobloxClient.onsale_asset-286"><span class="linenos">286</span></a> <span class="k">raise</span> <span class="n">RateLimitError</span><span class="p">(</span><span class="s2">&quot;Rate limit hit during onsale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.onsale_asset-287"><a href="#RobloxClient.onsale_asset-287"><span class="linenos">287</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">401</span><span class="p">,</span> <span class="mi">403</span><span class="p">):</span>
</span><span id="RobloxClient.onsale_asset-288"><a href="#RobloxClient.onsale_asset-288"><span class="linenos">288</span></a> <span class="k">raise</span> <span class="n">AuthError</span><span class="p">(</span><span class="s2">&quot;Not authorized to put this asset on sale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.onsale_asset-289"><a href="#RobloxClient.onsale_asset-289"><span class="linenos">289</span></a>
</span><span id="RobloxClient.onsale_asset-290"><a href="#RobloxClient.onsale_asset-290"><span class="linenos">290</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient.onsale_asset-291"><a href="#RobloxClient.onsale_asset-291"><span class="linenos">291</span></a> <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span> <span class="k">else</span> <span class="p">{}</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="RobloxClient.onsale_asset-310"><a href="#RobloxClient.onsale_asset-310"><span class="linenos">310</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">onsale_asset</span><span class="p">(</span>
</span><span id="RobloxClient.onsale_asset-311"><a href="#RobloxClient.onsale_asset-311"><span class="linenos">311</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-312"><a href="#RobloxClient.onsale_asset-312"><span class="linenos">312</span></a> <span class="n">collectible_item_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-313"><a href="#RobloxClient.onsale_asset-313"><span class="linenos">313</span></a> <span class="n">price</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-314"><a href="#RobloxClient.onsale_asset-314"><span class="linenos">314</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="RobloxClient.onsale_asset-315"><a href="#RobloxClient.onsale_asset-315"><span class="linenos">315</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Put an asset on sale.&quot;&quot;&quot;</span>
</span><span id="RobloxClient.onsale_asset-316"><a href="#RobloxClient.onsale_asset-316"><span class="linenos">316</span></a> <span class="n">csrf</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_csrf_token</span><span class="p">()</span>
</span><span id="RobloxClient.onsale_asset-317"><a href="#RobloxClient.onsale_asset-317"><span class="linenos">317</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span>
</span><span id="RobloxClient.onsale_asset-318"><a href="#RobloxClient.onsale_asset-318"><span class="linenos">318</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/</span><span class="si">{</span><span class="n">collectible_item_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-319"><a href="#RobloxClient.onsale_asset-319"><span class="linenos">319</span></a> <span class="n">json</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient.onsale_asset-320"><a href="#RobloxClient.onsale_asset-320"><span class="linenos">320</span></a> <span class="s2">&quot;saleLocationConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;saleLocationType&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;places&quot;</span><span class="p">:</span> <span class="p">[]},</span>
</span><span id="RobloxClient.onsale_asset-321"><a href="#RobloxClient.onsale_asset-321"><span class="linenos">321</span></a> <span class="s2">&quot;saleStatus&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-322"><a href="#RobloxClient.onsale_asset-322"><span class="linenos">322</span></a> <span class="s2">&quot;quantityLimitPerUser&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-323"><a href="#RobloxClient.onsale_asset-323"><span class="linenos">323</span></a> <span class="s2">&quot;resaleRestriction&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-324"><a href="#RobloxClient.onsale_asset-324"><span class="linenos">324</span></a> <span class="s2">&quot;priceInRobux&quot;</span><span class="p">:</span> <span class="n">price</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-325"><a href="#RobloxClient.onsale_asset-325"><span class="linenos">325</span></a> <span class="s2">&quot;priceOffset&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-326"><a href="#RobloxClient.onsale_asset-326"><span class="linenos">326</span></a> <span class="s2">&quot;optOutFromRegionalPricing&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-327"><a href="#RobloxClient.onsale_asset-327"><span class="linenos">327</span></a> <span class="s2">&quot;isFree&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-328"><a href="#RobloxClient.onsale_asset-328"><span class="linenos">328</span></a> <span class="p">},</span>
</span><span id="RobloxClient.onsale_asset-329"><a href="#RobloxClient.onsale_asset-329"><span class="linenos">329</span></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
</span><span id="RobloxClient.onsale_asset-330"><a href="#RobloxClient.onsale_asset-330"><span class="linenos">330</span></a> <span class="s2">&quot;X-CSRF-TOKEN&quot;</span><span class="p">:</span> <span class="n">csrf</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-331"><a href="#RobloxClient.onsale_asset-331"><span class="linenos">331</span></a> <span class="s2">&quot;User-Agent&quot;</span><span class="p">:</span> <span class="s2">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-332"><a href="#RobloxClient.onsale_asset-332"><span class="linenos">332</span></a> <span class="s2">&quot;Referer&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com/&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-333"><a href="#RobloxClient.onsale_asset-333"><span class="linenos">333</span></a> <span class="s2">&quot;Origin&quot;</span><span class="p">:</span> <span class="s2">&quot;https://create.roblox.com&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-334"><a href="#RobloxClient.onsale_asset-334"><span class="linenos">334</span></a> <span class="p">},</span>
</span><span id="RobloxClient.onsale_asset-335"><a href="#RobloxClient.onsale_asset-335"><span class="linenos">335</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient.onsale_asset-336"><a href="#RobloxClient.onsale_asset-336"><span class="linenos">336</span></a> <span class="p">)</span>
</span><span id="RobloxClient.onsale_asset-337"><a href="#RobloxClient.onsale_asset-337"><span class="linenos">337</span></a>
</span><span id="RobloxClient.onsale_asset-338"><a href="#RobloxClient.onsale_asset-338"><span class="linenos">338</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">429</span><span class="p">:</span>
</span><span id="RobloxClient.onsale_asset-339"><a href="#RobloxClient.onsale_asset-339"><span class="linenos">339</span></a> <span class="k">raise</span> <span class="n">RateLimitError</span><span class="p">(</span><span class="s2">&quot;Rate limit hit during onsale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.onsale_asset-340"><a href="#RobloxClient.onsale_asset-340"><span class="linenos">340</span></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">401</span><span class="p">,</span> <span class="mi">403</span><span class="p">):</span>
</span><span id="RobloxClient.onsale_asset-341"><a href="#RobloxClient.onsale_asset-341"><span class="linenos">341</span></a> <span class="k">raise</span> <span class="n">AuthError</span><span class="p">(</span><span class="s2">&quot;Not authorized to put this asset on sale.&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.onsale_asset-342"><a href="#RobloxClient.onsale_asset-342"><span class="linenos">342</span></a>
</span><span id="RobloxClient.onsale_asset-343"><a href="#RobloxClient.onsale_asset-343"><span class="linenos">343</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient.onsale_asset-344"><a href="#RobloxClient.onsale_asset-344"><span class="linenos">344</span></a> <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span> <span class="k">else</span> <span class="p">{}</span>
</span></pre></div>
@@ -909,19 +1036,19 @@ failures in the returned BatchResult.</p>
</div>
<a class="headerlink" href="#RobloxClient.get_collectible_item_id"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="RobloxClient.get_collectible_item_id-293"><a href="#RobloxClient.get_collectible_item_id-293"><span class="linenos">293</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_collectible_item_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asset_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">max_attempts</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">poll_interval</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">3.0</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="RobloxClient.get_collectible_item_id-294"><a href="#RobloxClient.get_collectible_item_id-294"><span class="linenos">294</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Look up the collectible item ID (UUID) for a given asset ID, retrying until available.&quot;&quot;&quot;</span>
</span><span id="RobloxClient.get_collectible_item_id-295"><a href="#RobloxClient.get_collectible_item_id-295"><span class="linenos">295</span></a> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_attempts</span><span class="p">):</span>
</span><span id="RobloxClient.get_collectible_item_id-296"><a href="#RobloxClient.get_collectible_item_id-296"><span class="linenos">296</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="RobloxClient.get_collectible_item_id-297"><a href="#RobloxClient.get_collectible_item_id-297"><span class="linenos">297</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/0/</span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.get_collectible_item_id-298"><a href="#RobloxClient.get_collectible_item_id-298"><span class="linenos">298</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient.get_collectible_item_id-299"><a href="#RobloxClient.get_collectible_item_id-299"><span class="linenos">299</span></a> <span class="p">)</span>
</span><span id="RobloxClient.get_collectible_item_id-300"><a href="#RobloxClient.get_collectible_item_id-300"><span class="linenos">300</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient.get_collectible_item_id-301"><a href="#RobloxClient.get_collectible_item_id-301"><span class="linenos">301</span></a> <span class="n">collectible_item_id</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;collectibleItemId&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.get_collectible_item_id-302"><a href="#RobloxClient.get_collectible_item_id-302"><span class="linenos">302</span></a> <span class="k">if</span> <span class="n">collectible_item_id</span><span class="p">:</span>
</span><span id="RobloxClient.get_collectible_item_id-303"><a href="#RobloxClient.get_collectible_item_id-303"><span class="linenos">303</span></a> <span class="k">return</span> <span class="n">collectible_item_id</span>
</span><span id="RobloxClient.get_collectible_item_id-304"><a href="#RobloxClient.get_collectible_item_id-304"><span class="linenos">304</span></a> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">poll_interval</span><span class="p">)</span>
</span><span id="RobloxClient.get_collectible_item_id-305"><a href="#RobloxClient.get_collectible_item_id-305"><span class="linenos">305</span></a> <span class="k">raise</span> <span class="n">UploadError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;collectibleItemId not available for asset </span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2"> after </span><span class="si">{</span><span class="n">max_attempts</span><span class="si">}</span><span class="s2"> attempts.&quot;</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="RobloxClient.get_collectible_item_id-346"><a href="#RobloxClient.get_collectible_item_id-346"><span class="linenos">346</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_collectible_item_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asset_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">max_attempts</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="n">poll_interval</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">3.0</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="RobloxClient.get_collectible_item_id-347"><a href="#RobloxClient.get_collectible_item_id-347"><span class="linenos">347</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Look up the collectible item ID (UUID) for a given asset ID, retrying until available.&quot;&quot;&quot;</span>
</span><span id="RobloxClient.get_collectible_item_id-348"><a href="#RobloxClient.get_collectible_item_id-348"><span class="linenos">348</span></a> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_attempts</span><span class="p">):</span>
</span><span id="RobloxClient.get_collectible_item_id-349"><a href="#RobloxClient.get_collectible_item_id-349"><span class="linenos">349</span></a> <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
</span><span id="RobloxClient.get_collectible_item_id-350"><a href="#RobloxClient.get_collectible_item_id-350"><span class="linenos">350</span></a> <span class="sa">f</span><span class="s2">&quot;https://itemconfiguration.roblox.com/v1/collectibles/0/</span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="RobloxClient.get_collectible_item_id-351"><a href="#RobloxClient.get_collectible_item_id-351"><span class="linenos">351</span></a> <span class="n">cookies</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_csrf_cookies</span><span class="p">,</span>
</span><span id="RobloxClient.get_collectible_item_id-352"><a href="#RobloxClient.get_collectible_item_id-352"><span class="linenos">352</span></a> <span class="p">)</span>
</span><span id="RobloxClient.get_collectible_item_id-353"><a href="#RobloxClient.get_collectible_item_id-353"><span class="linenos">353</span></a> <span class="n">response</span><span class="o">.</span><span class="n">raise_for_status</span><span class="p">()</span>
</span><span id="RobloxClient.get_collectible_item_id-354"><a href="#RobloxClient.get_collectible_item_id-354"><span class="linenos">354</span></a> <span class="n">collectible_item_id</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;collectibleItemId&quot;</span><span class="p">)</span>
</span><span id="RobloxClient.get_collectible_item_id-355"><a href="#RobloxClient.get_collectible_item_id-355"><span class="linenos">355</span></a> <span class="k">if</span> <span class="n">collectible_item_id</span><span class="p">:</span>
</span><span id="RobloxClient.get_collectible_item_id-356"><a href="#RobloxClient.get_collectible_item_id-356"><span class="linenos">356</span></a> <span class="k">return</span> <span class="n">collectible_item_id</span>
</span><span id="RobloxClient.get_collectible_item_id-357"><a href="#RobloxClient.get_collectible_item_id-357"><span class="linenos">357</span></a> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">poll_interval</span><span class="p">)</span>
</span><span id="RobloxClient.get_collectible_item_id-358"><a href="#RobloxClient.get_collectible_item_id-358"><span class="linenos">358</span></a> <span class="k">raise</span> <span class="n">UploadError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;collectibleItemId not available for asset </span><span class="si">{</span><span class="n">asset_id</span><span class="si">}</span><span class="s2"> after </span><span class="si">{</span><span class="n">max_attempts</span><span class="si">}</span><span class="s2"> attempts.&quot;</span><span class="p">)</span>
</span></pre></div>
@@ -941,9 +1068,9 @@ failures in the returned BatchResult.</p>
</div>
<a class="headerlink" href="#RobloxClient.close"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="RobloxClient.close-307"><a href="#RobloxClient.close-307"><span class="linenos">307</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="RobloxClient.close-308"><a href="#RobloxClient.close-308"><span class="linenos">308</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Close the underlying HTTP client.&quot;&quot;&quot;</span>
</span><span id="RobloxClient.close-309"><a href="#RobloxClient.close-309"><span class="linenos">309</span></a> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">aclose</span><span class="p">()</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="RobloxClient.close-360"><a href="#RobloxClient.close-360"><span class="linenos">360</span></a> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="RobloxClient.close-361"><a href="#RobloxClient.close-361"><span class="linenos">361</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Close the underlying HTTP client.&quot;&quot;&quot;</span>
</span><span id="RobloxClient.close-362"><a href="#RobloxClient.close-362"><span class="linenos">362</span></a> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">_http</span><span class="o">.</span><span class="n">aclose</span><span class="p">()</span>
</span></pre></div>
+1 -1
View File
File diff suppressed because one or more lines are too long