From 8ab351825fe683a200a1319634b43ae4ef2b87cc Mon Sep 17 00:00:00 2001 From: Tyler Delane Date: Fri, 23 Jan 2026 11:22:59 -0800 Subject: [PATCH 1/5] Set default pastebin to Sharey --- cloudbot/util/web.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbot/util/web.py b/cloudbot/util/web.py index 3d0db332..0c2818df 100644 --- a/cloudbot/util/web.py +++ b/cloudbot/util/web.py @@ -38,7 +38,7 @@ # Constants DEFAULT_SHORTENER = "is.gd" -DEFAULT_PASTEBIN = "" +DEFAULT_PASTEBIN = "sharey" HASTEBIN_SERVER = "https://hastebin.com" From 972fd5b2ffab9e1e4fd2f623100b05eb61eb43aa Mon Sep 17 00:00:00 2001 From: Tyler Delane Date: Fri, 23 Jan 2026 11:23:33 -0800 Subject: [PATCH 2/5] remove tests for sprunge and add new tests for sharey --- tests/plugin_tests/test_paste_sprunge.py | 75 ------------------------ 1 file changed, 75 deletions(-) delete mode 100644 tests/plugin_tests/test_paste_sprunge.py diff --git a/tests/plugin_tests/test_paste_sprunge.py b/tests/plugin_tests/test_paste_sprunge.py deleted file mode 100644 index 762085ee..00000000 --- a/tests/plugin_tests/test_paste_sprunge.py +++ /dev/null @@ -1,75 +0,0 @@ -import pytest - -from cloudbot.util import web -from plugins.pastebins import sprunge - - -def test_register() -> None: - sprunge.register() - - assert web.pastebins.get("sprunge") is not None - - sprunge.unregister() - - assert web.pastebins.get("sprunge") is None - - -def test_paste(mock_requests) -> None: - sprunge.register() - - paster = web.pastebins["sprunge"] - - mock_requests.add( - "POST", "http://sprunge.us", body="http://sprunge.us/foobar" - ) - assert paster.paste("test data", "txt") == "http://sprunge.us/foobar?txt" - sprunge.unregister() - - -def test_data_params(mock_requests) -> None: - sprunge.register() - - body = None - - def req_cb(req): - nonlocal body - body = req.body - return 200, {}, "http://sprunge.us/foobar\n" - - paster = web.pastebins["sprunge"] - mock_requests.add_callback("POST", "http://sprunge.us", callback=req_cb) - assert paster.paste("test data", "txt") == "http://sprunge.us/foobar?txt" - assert body == "sprunge=test+data" - sprunge.unregister() - - -def test_paste_bytes(mock_requests) -> None: - sprunge.register() - - paster = web.pastebins["sprunge"] - - mock_requests.add( - "POST", "http://sprunge.us", body="http://sprunge.us/foobar" - ) - assert paster.paste(b"test data", "txt") == "http://sprunge.us/foobar?txt" - sprunge.unregister() - - -def test_paste_error(mock_requests) -> None: - sprunge.register() - - paster = web.pastebins["sprunge"] - - with pytest.raises(web.ServiceError): - paster.paste("test data", "txt") - - mock_requests.add( - "POST", - "http://sprunge.us", - status=500, - ) - - with pytest.raises(web.ServiceHTTPError): - paster.paste("test data", "txt") - - sprunge.unregister() From 1f69e30447bfdddea2cd48c627bb1d69b5c936df Mon Sep 17 00:00:00 2001 From: Tyler Delane Date: Fri, 23 Jan 2026 11:24:01 -0800 Subject: [PATCH 3/5] add configuration for the sharey pastebin --- plugins/pastebins/{sprunge.py => sharey.py} | 25 +++++++++++---------- 1 file changed, 13 insertions(+), 12 deletions(-) rename plugins/pastebins/{sprunge.py => sharey.py} (63%) diff --git a/plugins/pastebins/sprunge.py b/plugins/pastebins/sharey.py similarity index 63% rename from plugins/pastebins/sprunge.py rename to plugins/pastebins/sharey.py index ea47dbb6..c69849f9 100644 --- a/plugins/pastebins/sprunge.py +++ b/plugins/pastebins/sharey.py @@ -1,3 +1,4 @@ +import json import requests from requests import HTTPError, RequestException @@ -10,25 +11,25 @@ ) -class Sprunge(Pastebin): +class Sharey(Pastebin): def __init__(self, base_url) -> None: super().__init__() self.url = base_url def paste(self, data, ext) -> str: - if isinstance(data, str): - encoded = data.encode() - else: - encoded = data + try: + encoded = json.loads(data) + except json.JSONDecodeError: + encoded = {"content": data} - params = { - "sprunge": encoded, - } + # params = { + # "content": encoded, + # } try: - with requests.post(self.url, data=params) as response: + with requests.post(self.url, json=encoded) as response: response.raise_for_status() - url = response.text.strip() + url = response.json()["url"] except HTTPError as e: r = e.response raise ServiceHTTPError(r.reason, r) from e @@ -43,9 +44,9 @@ def paste(self, data, ext) -> str: @hook.on_start() def register() -> None: - pastebins.register("sprunge", Sprunge("http://sprunge.us")) + pastebins.register("sharey", Sharey("https://sharey.org/api/paste")) @hook.on_stop() def unregister() -> None: - pastebins.remove("sprunge") + pastebins.remove("sharey") From ed6498e8760763290e3c082c07d6b5cdee6f0828 Mon Sep 17 00:00:00 2001 From: Tyler Delane Date: Fri, 23 Jan 2026 11:32:00 -0800 Subject: [PATCH 4/5] add tests for the sharey pastebin --- tests/plugin_tests/test_paste_sharey.py | 81 +++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/plugin_tests/test_paste_sharey.py diff --git a/tests/plugin_tests/test_paste_sharey.py b/tests/plugin_tests/test_paste_sharey.py new file mode 100644 index 00000000..5c9742b3 --- /dev/null +++ b/tests/plugin_tests/test_paste_sharey.py @@ -0,0 +1,81 @@ +import pytest +import json + +from cloudbot.util import web +from plugins.pastebins import sharey + + +def test_register() -> None: + sharey.register() + + assert web.pastebins.get("sharey") is not None + + sharey.unregister() + + assert web.pastebins.get("sharey") is None + + +def test_paste(mock_requests) -> None: + sharey.register() + + paster = web.pastebins["sharey"] + + mock_requests.add( + "POST", "https://sharey.org/api/paste", json={"url": "https://sharey.org/foobar"} + ) + assert paster.paste("test data", "txt") == "https://sharey.org/foobar?txt" + sharey.unregister() + + +def test_data_params(mock_requests) -> None: + sharey.register() + + body = None + + def req_cb(req): + nonlocal body + body = req.body + return 200, {}, json.dumps({"url": "https://sharey.org/foobar"}) + + paster = web.pastebins["sharey"] + mock_requests.add_callback("POST", "https://sharey.org/api/paste", callback=req_cb) + assert paster.paste("test data", "txt") == "https://sharey.org/foobar?txt" + assert json.loads(body) == {"content": "test data"} + sharey.unregister() + + +def test_paste_json_input(mock_requests) -> None: + sharey.register() + + body = None + + def req_cb(req): + nonlocal body + body = req.body + return 200, {}, json.dumps({"url": "https://sharey.org/foobar"}) + + paster = web.pastebins["sharey"] + mock_requests.add_callback("POST", "https://sharey.org/api/paste", callback=req_cb) + assert paster.paste('{"foo": "bar"}', "txt") == "https://sharey.org/foobar?txt" + assert json.loads(body) == {"foo": "bar"} + sharey.unregister() + + +def test_paste_error(mock_requests) -> None: + sharey.register() + + paster = web.pastebins["sharey"] + + with pytest.raises(web.ServiceError): + paster.paste("test data", "txt") + + mock_requests.add( + "POST", + "https://sharey.org/api/paste", + status=500, + ) + + with pytest.raises(web.ServiceHTTPError): + paster.paste("test data", "txt") + + sharey.unregister() From e100147bbaa206fdbe31a6b06176535b29879e99 Mon Sep 17 00:00:00 2001 From: Tyler Delane Date: Fri, 23 Jan 2026 11:50:57 -0800 Subject: [PATCH 5/5] making modifications as per pre-commit requirements to pass all tests --- plugins/pastebins/sharey.py | 7 ++----- tests/plugin_tests/test_paste_sharey.py | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/plugins/pastebins/sharey.py b/plugins/pastebins/sharey.py index c69849f9..129a89ee 100644 --- a/plugins/pastebins/sharey.py +++ b/plugins/pastebins/sharey.py @@ -1,4 +1,5 @@ import json + import requests from requests import HTTPError, RequestException @@ -16,16 +17,12 @@ def __init__(self, base_url) -> None: super().__init__() self.url = base_url - def paste(self, data, ext) -> str: + def paste(self, data: str | bytes, ext: str) -> str: try: encoded = json.loads(data) except json.JSONDecodeError: encoded = {"content": data} - # params = { - # "content": encoded, - # } - try: with requests.post(self.url, json=encoded) as response: response.raise_for_status() diff --git a/tests/plugin_tests/test_paste_sharey.py b/tests/plugin_tests/test_paste_sharey.py index 5c9742b3..8d0be33e 100644 --- a/tests/plugin_tests/test_paste_sharey.py +++ b/tests/plugin_tests/test_paste_sharey.py @@ -1,6 +1,7 @@ -import pytest import json +import pytest + from cloudbot.util import web from plugins.pastebins import sharey @@ -21,7 +22,9 @@ def test_paste(mock_requests) -> None: paster = web.pastebins["sharey"] mock_requests.add( - "POST", "https://sharey.org/api/paste", json={"url": "https://sharey.org/foobar"} + "POST", + "https://sharey.org/api/paste", + json={"url": "https://sharey.org/foobar"}, ) assert paster.paste("test data", "txt") == "https://sharey.org/foobar?txt" sharey.unregister() @@ -30,7 +33,7 @@ def test_paste(mock_requests) -> None: def test_data_params(mock_requests) -> None: sharey.register() - body = None + body: str | bytes | None = None def req_cb(req): nonlocal body @@ -38,8 +41,11 @@ def req_cb(req): return 200, {}, json.dumps({"url": "https://sharey.org/foobar"}) paster = web.pastebins["sharey"] - mock_requests.add_callback("POST", "https://sharey.org/api/paste", callback=req_cb) + mock_requests.add_callback( + "POST", "https://sharey.org/api/paste", callback=req_cb + ) assert paster.paste("test data", "txt") == "https://sharey.org/foobar?txt" + assert body is not None assert json.loads(body) == {"content": "test data"} sharey.unregister() @@ -47,7 +53,7 @@ def req_cb(req): def test_paste_json_input(mock_requests) -> None: sharey.register() - body = None + body: str | bytes | None = None def req_cb(req): nonlocal body @@ -55,8 +61,13 @@ def req_cb(req): return 200, {}, json.dumps({"url": "https://sharey.org/foobar"}) paster = web.pastebins["sharey"] - mock_requests.add_callback("POST", "https://sharey.org/api/paste", callback=req_cb) - assert paster.paste('{"foo": "bar"}', "txt") == "https://sharey.org/foobar?txt" + mock_requests.add_callback( + "POST", "https://sharey.org/api/paste", callback=req_cb + ) + assert ( + paster.paste('{"foo": "bar"}', "txt") == "https://sharey.org/foobar?txt" + ) + assert body is not None assert json.loads(body) == {"foo": "bar"} sharey.unregister()