mirror of
https://github.com/Aurorastation/Aurora-Old.git
synced 2026-08-27 06:36:22 +01:00
Pulls the proper news from the SQL, in accordance with the newer system centered around the website. Note that uploadIP, uploadtime and approvetime are specific items for us. If you don't have a website form for submitting them, then you're free to not use them (just comment out during execution). I *was* going to add the newscaster functionality to the PDAs. But. The code spidered a little too far for me to bother with the present situation. Sorry v.v
107 lines
3.0 KiB
Plaintext
107 lines
3.0 KiB
Plaintext
/*
|
|
*
|
|
*For housing code that's related to bringing news over at preset times from an SQL database into the game and publish them
|
|
*
|
|
*The basic premise is:
|
|
*This gets created in the master controller.
|
|
*It then starts checking and crawling down an organized SQL list.
|
|
*Releases news articles one after another, based on when they're meant to be released.
|
|
*It's recursive and kills itself once it runs to the end of it's list.
|
|
*
|
|
*TO DO:
|
|
*Make it create a new feed channel if specified.
|
|
*
|
|
*/
|
|
|
|
var/global/datum/sqlnews/sqlnews_controller
|
|
|
|
datum/sqlnews
|
|
var/count = 0 //arbitrary count variable, increased every time an article is pulled, for sorting SQL data.
|
|
var/time //publishtime, time in gametime
|
|
var/id //id, primary-key, of the news article that's destined for pulling.
|
|
var/running = 1 //whenever no results are found, this ticks over to a 0, and thus, no more updates.
|
|
var/fails = 0
|
|
|
|
datum/sqlnews/proc/process()
|
|
if(!running == 1) //No more news, immediate kill and return.
|
|
return
|
|
|
|
if(fails >= 5) //If it sucks at running, we'll off it.
|
|
kill()
|
|
return
|
|
|
|
if(!id && !time) //No entry loaded, update and load one.
|
|
update()
|
|
return
|
|
|
|
else if(time < world.time) //Running late! Time to publish the stored article!
|
|
publish()
|
|
return
|
|
|
|
datum/sqlnews/proc/update() //Updates the stored variables and preppes it for a new run of publish()
|
|
establish_db_connection()
|
|
if(!dbcon.IsConnected())
|
|
error("SQL database connection failed. Attempted to fetch news information.")
|
|
fails++
|
|
return
|
|
|
|
var/DBQuery/query = dbcon.NewQuery("SELECT id, publishtime FROM ss13_news WHERE status = '2' ORDER BY publishtime ASC LIMIT [count],1")
|
|
query.Execute()
|
|
|
|
if(!query.RowCount())
|
|
running = 0
|
|
return
|
|
|
|
while(query.NextRow())
|
|
id = query.item[1]
|
|
time = text2num(query.item[2]) * 600
|
|
|
|
count++
|
|
|
|
datum/sqlnews/proc/publish() //Uses data stored from the update() proc and: pulls further information required to publish an article, publishes it.
|
|
if(!id)
|
|
return
|
|
|
|
establish_db_connection()
|
|
if(!dbcon.IsConnected())
|
|
error("SQL database connection failed. Attempted to fetch news information.")
|
|
fails++
|
|
return
|
|
|
|
var/DBQuery/fetchquery = dbcon.NewQuery("SELECT channel, author, body FROM ss13_news WHERE id=[id]")
|
|
fetchquery.Execute()
|
|
|
|
while(fetchquery.NextRow())
|
|
var/channel = fetchquery.item[1]
|
|
var/author = fetchquery.item[2]
|
|
var/body = fetchquery.item[3]
|
|
|
|
var/datum/feed_message/newMsg = new /datum/feed_message
|
|
newMsg.author = author
|
|
newMsg.body = body
|
|
|
|
var/found //Do we need a new channel or not?
|
|
for(var/datum/feed_channel/FC in news_network.network_channels)
|
|
if(FC.channel_name == channel)
|
|
FC.messages += newMsg
|
|
found = 1
|
|
|
|
if(!found)
|
|
var/datum/feed_channel/NC = new /datum/feed_channel
|
|
NC.channel_name = channel
|
|
NC.author = author
|
|
NC.locked = 1
|
|
NC.is_admin_channel = 1
|
|
news_network.network_channels += NC
|
|
|
|
NC.messages += newMsg
|
|
|
|
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
|
|
NEWSCASTER.newsAlert("[channel]")
|
|
|
|
id = null
|
|
time = null
|
|
|
|
datum/sqlnews/proc/kill()
|
|
running = 0
|
|
return |