Module:Bluesky RSS Feed

From NOISZ Wiki

This module is a custom-designed RSS feed, designed to process a Bluesky RSS feed and output it as a template. Up to three search keywords can be input - OR rather than AND - to find posts that mention any of the keywords. A Bluesky RSS feed can be found by going to any user's page, and typing /rss at the end of the URL before hitting enter.

Usage

{{Template:Bluesky RSS Feed
|url= Bluesky RSS feed URL
|term1= Optional search term
|term2= Optional search term
|term3= Optional search term
}}

Example

{{Template:Bluesky RSS Feed
|url=https://bsky.app/profile/did:plc:ve2p3lz33ivtyikqztvsgtx3/rss
|term1=#NOISZ
}}

Will yield:

22 Dec 2025 01:42 +0000
An update has been released for NOISZ reV (Steam) and reCG (Switch). After completing NOISZ FINAL pt. 1, a new option will become available under Story on the title screen.

This code can't be used yet, but the time is approaching... #NOISZ

18 Dec 2025 22:38 +0000
Every part of the original NOISZ story is on sale at its lowest price yet! The base game is now a whopping 55% off??

Get ready for NOISZ FINAL pt.2 by playing through Ignition and re:||VERSE now! #NOISZ steam.noiszgame.com https://steam.noiszgame.com/

21 Nov 2025 08:35 +0000
game of the day in BRITAIN (also a lot of other places but it's the first time for the UK) #NOISZ_SL https://apps.apple.com/gb/story/id1610061994

20 Sep 2025 03:40 +0000
NOISZ SL 3.653 is now available on Android! This contains solely internal changes required due to Google policy updates. You may see a small performance improvement on Android 15 or later. #NOISZ_SL

19 Sep 2025 05:51 +0000
NOISZ SL is game of the day in uh. in umm. yeah #NOISZ_SL

15 Sep 2025 03:36 +0000
NOISZ SL 3.652 is now available! This is also a minor bugfix update. #NOISZ_SL

...But if you liked having massive HZ for no reason, we do have a game for you: godhand.anarch.games https://godhand.anarch.games/

12 Sep 2025 18:57 +0000
NOISZ SL 3.651 is now available! This is a minor bugfix update primarily related to new features/content. #NOISZ_SL

10 Sep 2025 21:44 +0000
❤️🖤 Happy birthday to the fiery duo, Sumire and Hitori! Scan the QR code for 24 hours of HEART folder Cake Mode (increased EXP/drops), and burn everything down with NUCLEAR DRIP's new V-IGNITION and alt art in NOISZ SL 3.650! 🖤❤️ #NOISZ_SL

🎨 aya-op10s.bsky.social




local capiunto = require 'capiunto'
local p = {}

function p.main(frame)

local args = frame:getParent().args
local posts = {}
local links = {}
local searchTerms = {}
local itemBefore= {}
local itemTwoBefore = {}
itemBefore["pubDate"] = ""

-- These are the search terms as defined in the template.
if args.term1 or args.term2 or args.term3 then
	searchTerms[1] = args.term1
	searchTerms[2] = args.term2
	searchTerms[3] = args.term3
-- If no search terms, then the search terms array is left blank so it'll match everything.
else 
	searchTerms = {""}
end

-- We use externaldata.getWebDate to obtain XML format data from the RSS feed at the URL defined by the user.
local rss = mw.ext.externaldata.getWebData {
    url = args.url
  , data = {pubDate = 'pubDate', description = 'description', link= 'link'}
  , format = 'xml'
}

-- We iterate over every post found in the RSS feed, in chronological order - hence ipairs. We need description, publish date AND link to know that it's a post. Additionally, k has to be more than 1 as the very first post to pop up in an RSS feed is the user bio which is not an actual post. The "links" array is a directory of links that have been processed; if it's already been processed, then it won't be added again. This helps for if there's more than one search term.


for k, v in ipairs(rss) do
	if v["description"] and v["pubDate"] and v["link"] then

-- Search over every search term in the search terms to make sure a post contains that term. If so, we bundle up the information into template form via the frame:expandTemplate method - the "Bluesky RSS Feed Row" template, to be precise - and put it into an incremental array which will later be expanded in full.

		for a, b in pairs(searchTerms) do
			if string.find(v["description"],b) and links[v["link"]] ~= true then 
-- Here we assign a new key to the links table, so that it can be accessed directly by the above conditions. The key is the post link, which is the one accessible unique attribute of each post.
				if k==1 then
					itemBefore["pubDate"] = v["pubDate"]
				end
				links[v["link"]] = true
				table.insert(posts, frame:expandTemplate{title = 'Bluesky RSS Feed Row', args = {description = v["description"], pubDate = v["pubDate"], link=v["link"]}})
				
			end	
		end
-- Bluesky's RSS feed is a little fucky; the first item in the table of items is just the bio, which has no published date, which means publish date for posts get thrown one out of order. So, I set the publish date in the table to be set here to be used in the next loop, to realign the dates. EDIT: Now it's two out of order fuck my entire baka life
		itemTwoBefore["pubDate"] = itemBefore["pubDate"]
		itemTwoBefore["link"] = itemBefore["link"]
		itemTwoBefore["description"] = itemBefore["description"]
		itemBefore["pubDate"] = v["pubDate"]
		itemBefore["link"] = v["link"]
		itemBefore["description"] = v["description"]
	end
end

-- table.concat to convert it from Lua table form to a form the wikitext can use - hence why it was frame:expand and not just raw data being put in.

return table.concat(posts,"")

end

return p