<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://bf2tech.uturista.pt/index.php?action=history&amp;feed=atom&amp;title=Scripts%3ATXT_File_base_Automatic_Announcements</id>
	<title>Scripts:TXT File base Automatic Announcements - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://bf2tech.uturista.pt/index.php?action=history&amp;feed=atom&amp;title=Scripts%3ATXT_File_base_Automatic_Announcements"/>
	<link rel="alternate" type="text/html" href="https://bf2tech.uturista.pt/index.php?title=Scripts:TXT_File_base_Automatic_Announcements&amp;action=history"/>
	<updated>2026-08-06T01:13:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://bf2tech.uturista.pt/index.php?title=Scripts:TXT_File_base_Automatic_Announcements&amp;diff=111&amp;oldid=prev</id>
		<title>Pireax: Created page with &quot;I just finished this and it&#039;s late, so I&#039;m just going to throw it up and beef up the text later. It&#039;s pretty well documented, so you shouldn&#039;t have much trouble. Refer to Wood...&quot;</title>
		<link rel="alternate" type="text/html" href="https://bf2tech.uturista.pt/index.php?title=Scripts:TXT_File_base_Automatic_Announcements&amp;diff=111&amp;oldid=prev"/>
		<updated>2018-06-22T15:30:09Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;I just finished this and it&amp;#039;s late, so I&amp;#039;m just going to throw it up and beef up the text later. It&amp;#039;s pretty well documented, so you shouldn&amp;#039;t have much trouble. Refer to Wood...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;I just finished this and it&amp;#039;s late, so I&amp;#039;m just going to throw it up and beef up the text later. It&amp;#039;s pretty well documented, so you shouldn&amp;#039;t have much trouble. Refer to Woody&amp;#039;s [[Scripts:Automatic_Announcements|Automatic Announcements]] script for installation. The only change to that being that I had to install the script in the admin/default.py script. This could&amp;#039;ve just been me, so keep in mind.&lt;br /&gt;
&lt;br /&gt;
NOTE: By default, logging is turned off since the files can get large, You should enable logging if you are having a problem and you need to debug it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    advert.py - written by Dave Lawrence - thrash@fragnastika.com&lt;br /&gt;
   &lt;br /&gt;
    Based on Woody&amp;#039;s &amp;quot;Automatic Announcements&amp;quot; script&lt;br /&gt;
    Loads messages from the text file &amp;quot;advert_msgs.txt&amp;quot;&lt;br /&gt;
        Use one line per message&lt;br /&gt;
    Log file can be used - advert_log.txt&lt;br /&gt;
        NOTE: Only use the log file for debug.  The output buffer is frequently&lt;br /&gt;
            flushed to ensure you see timely debug messages.  This *may* slow the&lt;br /&gt;
            game server down&lt;br /&gt;
    If you are having problems you can enable opt_SAdebug&lt;br /&gt;
        This will allow the script to run outside BF2&lt;br /&gt;
        There are no wrapers for the script, so the timer wont work, but you can&lt;br /&gt;
         debug probs with the message file&lt;br /&gt;
    NOTE: The advert_msgs.txt file is loaded into memory and I have no idea what&amp;#039;ll&lt;br /&gt;
        happen if you try to use an enormous file.  Food for thought :)&lt;br /&gt;
&lt;br /&gt;
Release notes:&lt;br /&gt;
    advert.py v1.0&lt;br /&gt;
&lt;br /&gt;
ToDo:&lt;br /&gt;
    - Allow messages to be reloaded while the server is running (if that is even possible)&lt;br /&gt;
       Perhaps a command from the console&lt;br /&gt;
       Can anyone point me in the right direction on how to do this?&lt;br /&gt;
    - Put the dbgWriter class into it&amp;#039;s own py so we can use it everywhere!&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   Top-Level Imports&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        OPTIONS&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
opt_Interval = 14   # Number of seconds between announcements&lt;br /&gt;
opt_SAdebug = 0     # For standalone debugging outside of bf2 enable this&lt;br /&gt;
# You can use this option to more easily figure out if your ads are loading&lt;br /&gt;
&lt;br /&gt;
# Enable logging to advert_log.txt&lt;br /&gt;
# Warning: only do this for debugging.  This log file could get huge!&lt;br /&gt;
opt_Debuglog = 0    # Logs to advert_log.txt&lt;br /&gt;
opt_Stdoutlog = 0   # Enable if you want ALL stdout msgs to be logged, you&amp;#039;ll see the actual msh go out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        GLOBALS&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
glob_dictMsgs = {}       # Where all the advert messages are stored&lt;br /&gt;
glob_hdlDbgout = {}&lt;br /&gt;
glob_IdxMsg = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Functions and Classes&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
# This is where it happens :)&lt;br /&gt;
def tmrhdlAdvert(data):&lt;br /&gt;
    global glob_IdxMsg&lt;br /&gt;
    global glob_dictMsgs&lt;br /&gt;
    # Handle the index overflow&lt;br /&gt;
    if glob_IdxMsg &amp;gt;= len(glob_dictMsgs):&lt;br /&gt;
        glob_IdxMsg = 0&lt;br /&gt;
    host.rcon_invoke(&amp;#039;game.sayall &amp;quot;%s&amp;quot;&amp;#039; % glob_dictMsgs[glob_IdxMsg])&lt;br /&gt;
    dprint(&amp;#039;game.sayall &amp;quot;%s&amp;quot;\n&amp;#039; % glob_dictMsgs[glob_IdxMsg], 1)&lt;br /&gt;
    glob_IdxMsg += 1&lt;br /&gt;
&lt;br /&gt;
class dbgWriter:&lt;br /&gt;
    flog = {}&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        global glob_hdlDbgout&lt;br /&gt;
        glob_hdlDbgout = self&lt;br /&gt;
        if opt_Debuglog == 1 or opt_SAdebug == 0:&lt;br /&gt;
            self.flog = open(&amp;#039;advert_log.txt&amp;#039;, &amp;#039;w&amp;#039;)&lt;br /&gt;
            self.stream = self.flog&lt;br /&gt;
        else:&lt;br /&gt;
            self.stream = sys.stdout&lt;br /&gt;
&lt;br /&gt;
        # Do we modify STDOUT or leave it as the default cfg from somewhere else?&lt;br /&gt;
        if opt_Stdoutlog == 1:&lt;br /&gt;
            sys.stdout = self&lt;br /&gt;
&lt;br /&gt;
    def write(self, str):&lt;br /&gt;
        self.stream.write(str)&lt;br /&gt;
&lt;br /&gt;
    def prt(self, str):&lt;br /&gt;
        self.stream.write(str)&lt;br /&gt;
       &lt;br /&gt;
    def flush(self):&lt;br /&gt;
        self.stream.flush()&lt;br /&gt;
&lt;br /&gt;
def dprint(msg, flush=0):&lt;br /&gt;
    glob_hdlDbgout.prt(msg)&lt;br /&gt;
    if flush == 1:&lt;br /&gt;
        glob_hdlDbgout.flush()&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
  Initialization and main code&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Init the debug writer&lt;br /&gt;
dbgWriter()&lt;br /&gt;
&lt;br /&gt;
dprint(&amp;quot;BF2 Advert Starting\n&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
# Check the interval and make sure it&amp;#039;s not too short.  Let&amp;#039;s clamp it at 15 secs&lt;br /&gt;
if opt_Interval &amp;lt; 15:&lt;br /&gt;
    dprint(&amp;quot;opt_Interval=%s which is too small, changing to 15 seconds\n&amp;quot; % opt_Interval)&lt;br /&gt;
    opt_Interval = 15&lt;br /&gt;
&lt;br /&gt;
# TODO: There should be some way to auto detect if we&amp;#039;re running inside the BF2 engine, hmm :-\&lt;br /&gt;
# Allows BF2 modules to be disabled for local debugging&lt;br /&gt;
if(opt_SAdebug == 0):&lt;br /&gt;
    dprint(&amp;quot;Importing BF2 libs\n&amp;quot;, 1)&lt;br /&gt;
    import bf2&lt;br /&gt;
    import bf2.Timer&lt;br /&gt;
    import host&lt;br /&gt;
else:&lt;br /&gt;
    dprint(&amp;quot;Running in standalone mode\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
dprint(&amp;quot;Importing advertisment messages\n&amp;quot;, 1)&lt;br /&gt;
try:&lt;br /&gt;
    try:&lt;br /&gt;
        config = open(&amp;#039;advert_msgs.cfg&amp;#039;, &amp;#039;rt&amp;#039;)&lt;br /&gt;
    except:&lt;br /&gt;
        dprint(&amp;quot;Error opening advert_msgs.cfg- Is it missing?\n&amp;quot;)&lt;br /&gt;
    for line_ in config:&lt;br /&gt;
        line = line_.strip()&lt;br /&gt;
        if len(line) == 0 or line.startswith(&amp;#039;#&amp;#039;):  continue&lt;br /&gt;
        glob_dictMsgs[glob_IdxMsg] = line&lt;br /&gt;
        dprint(&amp;quot;%s\n&amp;quot; % glob_dictMsgs[glob_IdxMsg])&lt;br /&gt;
        glob_IdxMsg += 1&lt;br /&gt;
except IOError:&lt;br /&gt;
    dprint(&amp;quot;I/O Error on advert.cfg read - does it exist?\n&amp;quot;, 1)&lt;br /&gt;
    pass&lt;br /&gt;
&lt;br /&gt;
#Reset the glob_IdxMsg to point to the first message&lt;br /&gt;
glob_IdxMsg = 0&lt;br /&gt;
&lt;br /&gt;
# Let&amp;#039;s make sure that the timer gets initialized correctly&lt;br /&gt;
# It works now, but EA could &amp;quot;F&amp;quot; us later :)&lt;br /&gt;
try:&lt;br /&gt;
    # We bypass this initialization if we&amp;#039;re not running in BF2, this doesn;t *really* warrant a wrapper&lt;br /&gt;
    if opt_SAdebug == 0:&lt;br /&gt;
        timer = bf2.Timer(tmrhdlAdvert, opt_Interval, 1)&lt;br /&gt;
except:&lt;br /&gt;
    dprint(&amp;quot;&amp;#039;timer = bf2.Timer(tmrhdlAdvert, 1)&amp;#039; FAILED!!\n&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    # We bypass this initialization if we&amp;#039;re not running in BF2&lt;br /&gt;
    if opt_SAdebug == 0:&lt;br /&gt;
        timer.setRecurring(opt_Interval)&lt;br /&gt;
except:&lt;br /&gt;
    dprint(&amp;quot;&amp;#039;timer.setRecurring(optInterval))&amp;#039; FAILED!!\n&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
dprint(&amp;quot;tmrhadlAdvert istalled successfully\n&amp;quot;)&lt;br /&gt;
dprint(&amp;quot;BF2 Advert Started  %d messages\n&amp;quot; % len(glob_dictMsgs), 1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Just call it advert.py, save it in admin/ and add the following to your admin/__init__.py or admin/default.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;import advert &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The advert_msgs.cfg file needs to be in the root BF2 directory. The log file, advert_log.txt will show up in the root BF2 folder as well.&lt;br /&gt;
&lt;br /&gt;
Have fun!&lt;/div&gt;</summary>
		<author><name>Pireax</name></author>
	</entry>
</feed>