User Tools

Site Tools


Sidebar

Overview

Installation

MYSTIC -CFG

Visual Customization

Mystic Utilities (MUTIL)

Scripting Custom Modules

Quick Reference

What's New

python_examples

Mystic Python Examples

This page contains examples of code using Mystic Python. Use the table of contents to jump to the various examples below.


Simple Message Reader

msgread.mpy
#####################################################
# Simple Message Reader Example using Mystic Python #
#####################################################
 
# Reads messages in the user's current message base
# With a pause prompt and basic navigation
 
from mystic_bbs import *
 
# Load the current user and then load their current message base
# but fail if they have not selected a message base
 
user  = getuser(0)
mbase = getmbaseid(user["mbase"])
 
if mbase is None:
	writeln ("|CRYou have not selected a message base yet!|CR|CR|PA")
	quit()
 
# Open the message base then check to make sure its open before reading
# data from it
 
msg = msg_open(mbase["path"] + mbase["filename"]);
 
if msg is None:
	quit()
 
done = False
 
# Seek to the first message in the base and loop while a message
# is found, calling msg_next after each message so the next one
# will be loaded.  Seek must be called first even if reading
# from the first message.
 
msg_seek(msg, 0)
 
while msg_found(msg) and not done and not shutdown():
 
	# Load the message header information into a dictionary
	# and the message text into a list
 
	msghdr  = msg_gethdr(msg)
	msgtext = msg_gettxt(msg)
 
	# Show the message header, setting a line counter that can
	# be used to pause the screen
 
	writeln("|16|CL|15Msg#: " + str(msghdr["number"]) + " of " + str(msghdr["highmsg"]))
	writeln("|14From: " + msghdr["from"]);
	writeln("|13  To: " + msghdr["to"]);
	writeln("|11Subj: " + msghdr["subj"]);
	writeln("|09-------------------------------------------------------------------------------|07");
 
	pausecount = 4
 
	# loop through each line in the message (list) and pause when
	# we get more than 23 lines
 
	for line in msgtext:
 
		# before printing a line check if we need to pause
 
		if pausecount >= 23:
			pausecount = 1
 
			write("|14*PAUSE* Continue? (|15Y|14)es, (|15N|14)o, (|15Q|14)uit: |07")
 
			ch = onekey(chr(13) + 'YNQ', False)
 
			# after getting input, erase the pause prompt then process the input
 
			backspace(wherex(), True)
 
			if ch == 'Q':
				done = True
				break
			elif ch == 'N':
				break
 
		# increase pause counter and send a line of message text
		# unless it is a kludge line:
 
		if (line == "") or (line != "" and line[0] != chr(1)):
			pausecount += 1
			writeln(line)
 
	# At end of message, so lets give a prompt if we didn't get a quit
	# from the pause prompt:
 
	if not done:
		write("|CR|09MSG READER: (|11A|09)gain, (|11P|09)revious, (|11ENTER|09) Next, (|11Q|09) to Quit: ")
 
		ch = onekey(chr(13) + 'APQ', True);
 
		if ch == 'A':
			# do nothing here so it redisplays the same msg
			pass
 
		elif ch == 'P':
			if msghdr["number"] != 1:
				msg_prev(msg)
 
		elif ch == 'Q':
			done = True
			break	
		else:
			msg_next(msg);	
 
# Close the message base and report that we're done
 
msg_close(msg)
 
writeln("|CR|12Program complete: Press a key|PN");

MCI Helper Functions

mcihelp.mpy
import mystic_bbs as bbs;
 
def stripmci (str):
	pos = str.find("|")
 
	while pos != -1:
		str = str[:pos] + str[pos+3:]
		pos = str.find("|")
 
	return str
 
def mcilen (str):
 
	return len(stripmci(str))
 
 
text = "|12This is a |14test";
 
bbs.rwriteln(stripmci(text));
bbs.rwriteln(str(mcilen(text)))
 
bbs.writeln("|PA")

Simple File Lister

filelist.mpy
###################################################
# Simple File Listing Example using Mystic Python #
###################################################
 
# List files in the user's current file base
 
from mystic_bbs	import *
 
# filelist flags
 
file_offline = int("01")
file_invalid = int("02")
file_deleted = int("04")
file_failed  = int("08")
file_free    = int("10")
file_hatched = int("20")
 
# Load the current user and then load their current file base
# but fail if they have not selected a file base
 
user  = getuser(0)
fbase = getfbaseid(user["fbase"])
 
if fbase is None:
	writeln ("|CRYou have not selected a file base yet!|CR|CR|PA")
	quit()
 
# Open the file list then check to make sure its open before reading
# data from it
 
flist = fl_open(fbase["filename"]);
 
if flist is None:
	writeln("Cannot open file listing. Press a key|PN")
	quit()
 
done = False
 
# Seek to the first file in the list and loop while a file is found calling
# next after each file so the next one will be loaded.  Seek should always be
# called before cycling through the list
 
fl_seek(flist, 0, True)
 
while fl_found(flist) and not done and not shutdown():
 
	# Load the file information into a dictionary and then get the file
	# description
 
	fileinfo = fl_getfile(flist)
	filedesc = fl_getdesc(flist)
 
	# Show the file
 
	writeln("|CL|14File #" + str(fileinfo["number"]) + " of " + str(fileinfo["total"]))
	writeln("")
	writeln("|09File: |11" + fileinfo["filename"])
	writeln("|09Date: " + datestr(dated2u(fileinfo["date"]), "NNN DD YYYY HH:II:SS"))
	writeln("Size: " + str(fileinfo["size"]))
	writeln("DLs : " + str(fileinfo["dls"]))
	writeln("ULer: " + fileinfo["ulname"])
 
	flags = ""
 
	if fileinfo["flags"] & file_offline:
		flags = flags + "OFFLINE "
 
	if fileinfo["flags"] & file_invalid:
		flags = flags + "INVALID "
 
	if fileinfo["flags"] & file_deleted:
		flags = flags + "DELETED "
 
	if fileinfo["flags"] & file_failed:
		flags = flags + "FAILED "
 
	if fileinfo["flags"] & file_free:
		flags = flags + "FREE "
 
	if fileinfo["flags"] & file_hatched:
		flags = flags + "HATCHED "
 
	if flags == "":
		flags = "NONE"
 
	writeln("Flag: |13" + flags)
	writeln("")
	writeln("|14Description (" + str(fileinfo["lines"]) + " lines):")
	writeln("|03")
 
	# only print up to the first 10 lines so we can fit it on the screen
 
	for line in range(min(fileinfo["lines"], 10)):
		writeln(filedesc[line])
 
	writeln("")
	write("|16|09File List: (|11A|09)gain, (|11P|09)revious, (|11ENTER|09) Next, (|11Q|09) to Quit: |14")
 
	ch = onekey(chr(13) + 'APQ', True);
 
	if ch == 'A':
		# do nothing here so it redisplays the same file
		pass
 
	elif ch == 'P':
		fl_prev(flist)
 
	elif ch == 'Q':
		done = True
		break	
	else:
		fl_next(flist);	
 
# Close the file list and report that we're done
 
fl_close(flist)
 
writeln("|CR|12Program complete: Press a key|PN");

View Dictionaries and Lists

dump.mpy
from mystic_bbs import *
 
# Dump contents of a dictionary or list to the screen with
# screen pause
 
def dump (obj, linecount):
  if linecount == 1:
    textcolor(7)
  if type(obj) == dict:
    for k, v in obj.items():
      if hasattr(v, '__iter__'):
        writeln(k)
        dump(v, linecount)
      else:
        writeln ("{} : {}".format(k,v))
      linecount = linecount + 1
      if linecount == 23:
        write("|PA|07")
  elif type(obj) == list:
    for v in obj:
      if hasattr(v, '__iter__'):
        dump(v, linecount)
      else:
        writeln ("{}".format(v))
        linecount = linecount + 1   
        if linecount == 23:
          write("|PA|07")
  else:
    writeln("{}".format(obj))
    linecount = linecount + 1
    if linecount == 23:
      write("|PA|07")
 
# grab the current user and dump the contents of their user dictionary
# This function can be used to dump anything, users, bases, groups, etc
 
writeln("|CL|14Dumping contents of user:|07")
user = getuser(0)
dump(user, 1)
python_examples.txt · Last modified: 2019/03/09 22:40 by g00r00