Reference

pei(6)

Perl Empire Interface

NAME

pei - Perl Empire Interface

SYNOPSIS

pei [ -n ] [country] [representative] [host] [port]

-or-
pei [ -n ] [gamename]

DESCRIPTION

Pei is a powerful, fully extendible smart client for playing Empire. Features include:

Tools for managing and feeding civs, auto-exploring, setting dist-paths,
-

calculating the new efficiency of ships/planes/units, reading/sending telegrams and announcements, keeping track of enemy sectors and units, and managing production deltas.

-

Full perl integration. You can type perl commands at the empire prompt.

-

File redirection, piping, exec (read commands from a file), and runfeed (pipe the output of a program to pei).

-

Aliases. You can define your own aliases with arguments.

-

!!, !abc, and ^a^b history substitution

-

Multiple games. You may be connected to more than one game at a time, and switch between them.

-

Function mapping. You can call your own perl functions from within the client by defining your own function maps.

-

Output parsing. Server output is automatically parsed and stored in an internal database. There is a separate database for each game connected to.

-

Interrupt handling. ^C should be handled properly in most cases.

-

If the option -n is specified, then pei will be loaded without any tools. This is useful if you just want to log on quickly and check your mail.

An instance of pei begins by executing commands from the file .peirc in the home directory of the invoker. If a game has not been specified, then the user is presented with a 'Local%' prompt at which they can choose any game that was specifed by an 'addgame' line in .peirc.

Once a game has been specified, pei tries to connect to the game. If it was unable to connect, it will exit with a message explaining what went wrong.

Once connected, pei begins executing commands from the file start.exec in the current directory. Note that 'addgame' lines in .peirc can associate to each game its own directory.

Then pei repeatedly performs the following actions: Lines are read from the server and parsed until a prompt is encountered, then terminal input is parsed until an Empire command is encountered at which point pei sends the command to the server.

Lexical Structure

An input line can come from one of three places:
(1) You typed it in.
(2) It was read in from a file (e.g. "start.exec").
(3) It was the value of an alias.

In case (1), if the input line is of one of the following forms, it will undergo history substitution:

!!

Repeat the last command.

![text]

Repeat the last command starting with [text].
e.g. !cen

^[text]^[replace]

Replace [text] with [replace] in last command.
e.g. ^jjh^jnh

#

Input lines beginning with # are comments and are ignored.

Each input line consists of sequence of command lines separated by semicolons (note that semicolons inside single or double quotes don't count):
commandline1; commandline2; commandline3; ...

Before each command line is processed, whitespace at the beginning and end of it is removed. Each command line has the following syntax:

?[scommand]

If we are at a sub-prompt, send [scommand] to it, otherwise, ignore.
e.g. des; ?2,0; ?c

[ecommand]

Send the empire command [ecommand] to the server. If we were expecting ?[scommand], abort the previous command before sending.
e.g. cen 0,0
e.g. move; cen 2,0 (aborts move before doing cen)

:[syscmd]

Send [syscmd] to your operating system.
e.g. :ls

[command] > [filename]

Write the output of [command] to [filename] only if the file does not exist.
e.g. cen #1 > cenfile

[command] >! [filename]

Write the output of [command] to [filename] (if the file exists, overwrite it).
e.g. cen #1 >! cenfile

[command] >> [filename]

Append the output of [command] to [filename].
e.g. spy 3,3 >> spyfile

[command] | [syscmd]

Pipe the output of [command] to the system command [syscmd].
e.g. news | more

Any commandline beginning with "$", "&", "@", "%", "{", "print ", "undef ", or "eval " will be evaluated as a perl expression.

Commands

These commands are "function maps", and may be typed at the pei prompt when you are connected to a game:

exec [filename]

Read input lines from [filename]. If you don't want the commands printed to the terminal, then before the exec, you should have "$quiet = 1".
e.g. exec pei_commands

runfeed [syscmd]

Run the program [syscmd] and pipe the output to pei.
e.g. runfeed mycivmover

history [number]

Print the last [number] input lines. If [number] is ommitted, then $maxhistorysize is used.

Note that any [filename] or [syscmd] may use ~ to refer to the home directory of the user.

Variables

Any pei command may contain perl variables. These variables will be replaced by their values when the command is parsed. For example:
$a = "0,0"
cen $a (evaluates to "cen 0,0")

If you want to isolate a variable name from surrounding text, then you may use {} brackets as in:
$x = "ti"
na${x}on (evaluates to "nation")

Here are some special pei variables which you can define:

$AUTOGAME

If defined in ~/.peirc, then pei will automatically connect to this game when it starts up.

$TIMEOUT

the length of time (in seconds) that pei will wait for data from the server (default is 120). Increase this if you have a bad lag, and decrease it if your link is good.

$beep

default value is 1. If you don't want to get beeped when you receive a telegram in INFORM mode, then put $beep = 0 in your ~/.peirc file.

$maxhistorysize

The number of input lines remembered by pei in the history mechanism (default is 100).

$EDITOR

The editor that you would like to use for composing telegrams and announcements (default is "vi" or environment variable EDITOR if defined).

$PAGER

Program to display output one screenful at a time. (default is "more" or environment variable PAGER if defined).

$PEIPATH

The full pathname of the directory containing all the pei files (you shouldn't need to set this).

$mailflag

If $mailflag = 1 or $mailflag{gamename} = 1, then when you

%mailflag

use "mail" to read your telegrams, pei will send "n" to the server so that your telegrams won't get deleted. Useful for co-rulers.

$debug

If $debug = 1, then pei will display the login conversation between pei and the server when connecting to a game.

Aliases

You can define aliases in pei using the syntax:
alias [name] [stuff]

For example:
alias d- des * ?newd=- +

If you want to put multiple commands in an alias, then you must enclose [stuff] in quotes. For example:
alias cod "res * ?des=o&ocon<10; res * ?des=g&gold<10"

If you put perl variables in [stuff], then they will be evaluated at runtime. For example:
alias ca cen $a
$a = "0,0"
ca (evaluates to "cen 0,0")

The following variables are also defined:

$0

The alias name

$1, $2, $3, ...

Arguments 1, 2, 3, ... that were used when the alias was called

$+

All of the arguments

For example, if you define the alias foo as follows:
alias foo first: $1, second: $2, all: $+, This should be foo: $0

then:
foo a b c d e f

would evaluate to:
first: a, second: b, all: a b c d e f, This should be foo: foo

Here's a more useful example:
alias bridge "build b $1; ?$2; expl c $1 1 ${2}h"

Alias recursion is permitted. For example:
alias xp explore
alias xx xp c 0,0 1
xx jjh (evaluates to "explore c 0,0 1 jjh")

Comparison to eif

For those of you who are used to using eif, I've included this section to describe how eif syntax translates into pei syntax.

The easiest way to see how eif syntax translates into pei syntax is to see how pei converts your ~/.eifrc into ~/.peirc (this is automatically done if pei doesn't find ~/.peirc). For your reference, here is a translation table of eif syntax to pei syntax:

When converting ~/.eifrc to ~/.peirc, the following translations are made:

eif

pei

addgame a b c d e f

addgame a d e b c f

&

?

@

:

setvar name "string"

$name = "string"

${N:+}

${N}

${N:-word}

(tricky -- watch how pei converts it)

These translations you'll have to make by hand:

connect gamename

gamename

unsetvar name

undef $name

$%name

$ENV{'name'}

The following eif syntax should simply be rewritten in perl:
!?str?
${N:?word}
${<:%word}
${name:=word}

The eif syntax !n and !-n is not supported.

ENVIRONMENT VARIABLES

PERLLIB

List of directories searched when locating PERL libraries. Used to find tools.pl, parse.pl, ...

COUNTRY, PLAYER, EMPIREHOST, EMPIREPORT

If specified pei will use these variables to connect to an empire game.

EDITOR

Default editor for pei.

PAGER

Default screen pager to be used in pei.

PEIPATH

The full pathname of the directory containing all the pei files (you shouldn't need to set this).

FILES

README

Things that users of older versions of pei will need to know about this latest version.

INSTALL

Installation instructions.

BUGS

A list of known bugs.

CHANGES

A record of what got changed with version upgrades.

WISH_LIST

Changes that we hope to implement in the future.

pei

The program you run.

parse.pl

Parses server output into internal database.

tools.pl

Contains tools (nova, cmvr, ...).

mail.pl

Contains mail, wmail, tele, and anno tools.

simu.pl

Contains the "simu" tool.

example.peirc

Stuff for you to put in your ~/.peirc file (NOTE: don't make a ~/.peirc file until pei has had a chance to convert your ~/.eifrc into ~/.peirc).

pei.man

Pei users manual--you can also get this by typing "help pei" from within pei.

tools.man

Manual for pei tools--you can also get this by typing "help tools" from within pei.

hacker.man

Information useful to hackers.

$HOME/.peirc

Pei commands read when pei starts up.

$HOME/.eifrc

Converted to ~/.peirc if ~/.peirc doesn't exist.

$gamedir/start.exec

Commands executed when you first connect to a game.

$gamedir/$gamename.dump

Database of enemy sectors (used by "stat").

$gamedir/$gamename.ships

Database of enemy ships (used by "sstat").

$gamedir/$gamename.planes

Database of enemy planes (used by "pstat").

$gamedir/$gamename.units

Database of enemy land units (used by "lstat").

$gamedir/$gamename.teles

Your mailbox of Empire telegrams (used by "mail").

$gamedir/$gamename.wires

Announcements (used by "wmail").

BUGS

Readline support was removed as it interferes with the new Empire 3.x async messages. Graphical display tools have not been integrated into pei yet. lafe is a dumb client with both readline and async support. ptkei is a graphical client written in Python. Multiple clients may be used simultaneously via emp_hub.

SEE ALSO

lafe(6), emp_hub(6), ptkei(6), news:rec.games.empire, and http://empire.idlpaper.com/

AUTHORS

Drake Diedrich <[email protected]>

Wrote the original version of this program (called hpc.pl) which included perl integration, file redirection, piping, function mapping, parse mapping, shell escape, and exec. He also wrote parse.pl and simu.pl.

Ken Stevens <[email protected]>

Added .peirc, aliases, history substitution, runfeed, interrupt handling, documentation, multiple game support (addgame, kill, try), multiple commands separated by semicolon, sub-prompting using ?, and variable substitution.

Sam Tetherow <[email protected]>

Added the following tools: sneweff, pneweff, lneweff, tele, anno, mail, wmail, and foreach. Sam also completely rewrote parse.pl, adding many new parse maps.

pei is licensed under the GPL.