+ Permanently Delete/erase character from database:
+
+
+
+ Ban/violate :3 character and/or his account:
+
+
+
+ Reset password to the account of character name:
+
+
+
+ Set character name to position:
+
+ ERROR: You forgot to add (Senior Tutor) rank in config.php!
+
+
+
+
+ Give shop points to character:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/admin_gallery.php b/admin_gallery.php
new file mode 100644
index 0000000..447d1f1
--- /dev/null
+++ b/admin_gallery.php
@@ -0,0 +1,122 @@
+setContent($data);
+ $cache->save();
+}
+
+?>
Images in need of moderation:
+
+
+
+
+
+
+
+
+
+
+
+ ", $descr);
+ ?>
+
+
+
+
+ All good, no new images to moderate.';
+
+?>
Public Images:
+
+
+
+
+
+
+
+
+
+
+
+ ", $descr);
+ ?>
+
+
+
+
+ There are currently no public images.';
+
+?>
Deleted Images:
+
+
+
+
+
+
+
+
+
+
+
+ ", $descr);
+ ?>
+
+
+
+
+ There are currently no deleted images.';
+// end
+ include 'layout/overall/footer.php'; ?>
\ No newline at end of file
diff --git a/admin_news.php b/admin_news.php
new file mode 100644
index 0000000..e10d7ef
--- /dev/null
+++ b/admin_news.php
@@ -0,0 +1,157 @@
+News deleted!';
+ mysql_query("DELETE FROM `znote_news` WHERE `id`='$id';");
+ $cache = new Cache('engine/cache/news');
+ $news = fetchAllNews();
+ $cache->setContent($news);
+ $cache->save();
+ }
+ // Add news
+ if ($action === 'a') {
+ // fetch data
+ $char_array = user_character_list($user_data['id']);
+ ?>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/buypoints.php b/buypoints.php
new file mode 100644
index 0000000..d3ec272
--- /dev/null
+++ b/buypoints.php
@@ -0,0 +1,78 @@
+
+
+
+ This player has never died.';
+ }
+ //Done.
+ } else if ($config['TFSVersion'] == 'TFS_03') {
+ $array = user_fetch_deathlist03($user_id);
+ if ($array) {
+ ?>
+
+
+
+
+
\ No newline at end of file
diff --git a/config.php b/config.php
new file mode 100644
index 0000000..4365a86
--- /dev/null
+++ b/config.php
@@ -0,0 +1,461 @@
+ 'No vocation',
+ 1 => 'Sorcerer',
+ 2 => 'Druid',
+ 3 => 'Paladin',
+ 4 => 'Knight',
+ 5 => 'Master Sorcerer',
+ 6 => 'Elder Druid',
+ 7 => 'Royal Paladin',
+ 8 => 'Elite Knight',
+ );
+
+ // Town ids and names: (In RME map editor, open map, click CTRL + T to view towns, their names and their IDs.
+ // townID => 'townName' etc: ['3'=>'Thais']
+ $config['towns'] = array(
+ 0 => 'Town 0',
+ 1 => 'Town 1',
+ 2 => 'Town 2',
+ 3 => 'Town 3',
+ 4 => 'Town 4',
+ 5 => 'Town 5',
+ 6 => 'Town 6',
+ 7 => 'Town 7',
+ 8 => 'Town 8',
+ 9 => 'Town 9',
+ );
+
+ // Leave on black square in map and player should get teleported to their selected town.
+ // If chars get buggy set this position to a beginner location to force players there.
+ $config['default_pos'] = array(
+ 'x' => 5,
+ 'y' => 5,
+ 'z' => 2,
+ );
+
+ $config['war_status'] = array(
+ 0 => 'Pending..',
+ 1 => 'Accepted',
+ 2 => 'Rejected',
+ 3 => 'Cancelled',
+ 4 => '???',
+ 5 => 'Ended',
+ );
+
+ /* -- SUB PAGES --
+ Some custom layouts/templates have custom pages, they can use
+ this sub page functionality for that.
+ */
+ $config['allowSubPages'] = true;
+
+ // ---------------- \\
+ // Create Character \\
+ // ---------------- \\
+
+ // Max characters on each account:
+ $config['max_characters'] = 7;
+
+ // Available character vocation users can create.
+ $config['available_vocations'] = array(1, 2, 3, 4);
+
+ // Available towns (specify town ids, etc: (0, 1, 2); to display 3 town options (town id 0, 1 and 2).
+ $config['available_towns'] = array(1);
+
+ $config['level'] = 8;
+ $config['health'] = 185;
+ $config['mana'] = 35;
+ $config['cap'] = 435;
+ $config['soul'] = 0;
+
+ $config['maleOutfitId'] = 128;
+ $config['femaleOutfitId'] = 138;
+
+ // No vocation info (if user select vocation id 0, we force thees configurations on him
+ $config['nvlevel'] = 1;
+ $config['nvHealth'] = 150;
+ $config['nvMana'] = 0;
+ $config['nvCap'] = 400;
+ $config['nvSoul'] = 0;
+
+ $config['nvForceTown'] = 0; // Force a town to no vocation even though he selected something else? 0 = no, 1 = yes.
+ $config['nvTown'] = 0; // Town id to force no vocations to get to, if nvForceTown is 1.
+
+ // Minimum allowed character name letters. Etc 4 letters: "Kåre".
+ $config['minL'] = 4;
+ // Maximum allowed character name letters. Etc 20 letters: "Bobkåreolesofiesberg"
+ $config['maxL'] = 20;
+
+ // Maximum allowed character name words. Etc 2 words = "Bob Kåre", 3 words: "Bob Arne Kåre" as max char name words.
+ $config['maxW'] = 2;
+
+ // -------------- \\
+ // WEBSITE STUFF \\
+ // -------------- \\
+
+ // ONLY FOR TFS 0.2 (TFS 0.3/4 users don't need to care about this, as its fully loaded from db)
+ $config['house'] = array(
+ 'house_file' => 'C:\test\Mystic Spirit_0.2.5\data\world\forgotten-house.xml',
+ 'price_sqm' => '50', // price per house sqm
+ );
+
+ $config['status'] = array(
+ 'status_check' => false, //enable or disable status checker
+ 'status_ip' => '127.0.0.1',
+ 'status_port' => "7171",
+ );
+
+ $config['validate_IP'] = true; // Only allow legal IP addresses to register and create character.
+ $config['salt'] = false; // Some noob 0.3.6 servers don't support salt.
+
+ // Restricted names
+ $config['invalidNameTags'] = array("god", "gm", "cm", "gamemaster", "hoster", "admin", "admim", "adm", "owner", "staff");
+
+ // Level requirement to create guild? (Just set it to 1 to allow all levels).
+ $config['create_guild_level'] = 8;
+
+ // Change Gender can be purchased in shop, or perhaps you want to allow everyone to change gender for free?
+ $config['free_sex_change'] = false;
+
+ // Do you need to have premium account to create a guild?
+ $config['guild_require_premium'] = false;
+
+ $config['guildwar_enabled'] = true;
+
+ // Use htaccess rewrite? (basically this makes website.com/username work instead of website.com/characterprofile.php?name=username
+ // Linux users needs to enable mod_rewrite php extention to make it work properly, so set it to false if your lost and using Linux.
+ $config['htwrite'] = true;
+
+ // What client version and server port are you using on this OT?
+ // Used for the Downloads page.
+ $config['client'] = 960; // 954 = tibia 9.54
+
+ // Download link to client. Recommended:
+ // Select download link from remere map editor website!
+ // See list of clients: http://remeresmapeditor.com/marklar.php?clients
+ $config['client_download'] = 'http://remeresmapeditor.com/rmedl.php?file=tibia'. $config['client'] .'.exe';
+
+ $config['port'] = 7171; // Port number to connect to your OT.
+
+ // How often do you want highscores to update?
+ $config['cache_lifespan'] = 60 * 15; // 15 minutes.
+
+ // WARNING! Account names written here will have admin access to web page!
+ $config['page_admin_access'] = array(
+ 'otland0',
+ 'otland1',
+ 'znote'
+ );
+
+ // Built-in FORUM
+ // Enable forum, enable guildboards, level to create threads/post in them
+ // How long do they have to wait to create thread or post?
+ // How to design/display hidden/closed/sticky threads.
+ $config['forum'] = array(
+ 'enabled' => true,
+ 'guildboard' => true,
+ 'level' => 5,
+ 'cooldownPost' => 60,
+ 'cooldownCreate' => 180,
+ 'hidden' => '[H]',
+ 'closed' => '[C]',
+ 'sticky' => '[S]',
+ );
+
+ // Guilds and guild war pages will do lots of queries on bigger databases.
+ // So its recommended to require login to view them, but you can disable this
+ // If you don't have any problems with load.
+ $config['require_login'] = array(
+ 'guilds' => false,
+ 'guildwars' => false,
+ );
+
+ // IMPORTANT! Write a character name(that exist) that will represent website bans!
+ // Or remember to create character "God Website" character exist.
+ // If you don't do this, bann from admin panel won't work properly.
+ $config['website_char'] = 'God Website';
+
+ //----------------\\
+ // ADVANCED STUFF \\
+ //----------------\\
+
+ // Don't touch this unless you know what you are doing. (modifying this(key value) also requires modifications in OT files /XML/commands.xml).
+ $config['ingame_positions'] = array(
+ 1 => 'Player',
+ 2 => 'Tutor',
+ 3 => 'Senior Tutor',
+ 4 => 'Gamemaster',
+ 5 => 'Community Manager',
+ 6 => 'God',
+ );
+
+ // Enable OS advanced feautures? false = no, true = yes
+ $config['os_enabled'] = false;
+
+ // What kind of computer are you hosting this website on?
+ // Available options: LINUX or WINDOWS
+ $config['os'] = 'WINDOWS';
+
+ // Measure how much players are lagging in-game. (Not completed).
+ $config['ping'] = false;
+
+ // BAN STUFF - Don't touch this unless you know what you are doing.
+ // You can order the lines the way you want, from top to bot, in which order you
+ // wish for them to be displayed in admin panel. Just make sure key[#] represent your describtion.
+ $config['ban_type'] = array(
+ 4 => 'NOTATION_ACCOUNT',
+ 2 => 'NAMELOCK_PLAYER',
+ 3 => 'BAN_ACCOUNT',
+ 5 => 'DELETE_ACCOUNT',
+ 1 => 'BAN_IPADDRESS',
+ );
+
+ // BAN STUFF - Don't touch this unless you know what you are doing.
+ // You can order the lines the way you want, from top to bot, in which order you
+ // wish for them to be displayed in admin panel. Just make sure key[#] represent your describtion.
+ $config['ban_action'] = array(
+ 0 => 'Notation',
+ 1 => 'Name Report',
+ 2 => 'Banishment',
+ 3 => 'Name Report + Banishment',
+ 4 => 'Banishment + Final Warning',
+ 5 => 'NR + Ban + FW',
+ 6 => 'Statement Report',
+ );
+
+ // Ban reasons, for changes beside default values to work with client,
+ // you also need to edit sources (tools.cpp line 1096)
+ $config['ban_reason'] = array(
+ 0 => 'Offensive Name',
+ 1 => 'Invalid Name Format',
+ 2 => 'Unsuitable Name',
+ 3 => 'Name Inciting Rule Violation',
+ 4 => 'Offensive Statement',
+ 5 => 'Spamming',
+ 6 => 'Illegal Advertising',
+ 7 => 'Off-Topic Public Statement',
+ 8 => 'Non-English Public Statement',
+ 9 => 'Inciting Rule Violation',
+ 10 => 'Bug Abuse',
+ 11 => 'Game Weakness Abuse',
+ 12 => 'Using Unofficial Software to Play',
+ 13 => 'Hacking',
+ 14 => 'Multi-Clienting',
+ 15 => 'Account Trading or Sharing',
+ 16 => 'Threatening Gamemaster',
+ 17 => 'Pretending to Have Influence on Rule Enforcement',
+ 18 => 'False Report to Gamemaster',
+ 19 => 'Destructive Behaviour',
+ 20 => 'Excessive Unjustified Player Killing',
+ 21 => 'Spoiling Auction',
+ );
+
+ // BAN STUFF
+ // Ban time duration selection in admin panel
+ // seconds => describtion
+ $config['ban_time'] = array(
+ 3600 => '1 hour',
+ 21600 => '6 hours',
+ 43200 => '12 hours',
+ 86400 => '1 day',
+ 259200 => '3 days',
+ 604800 => '1 week',
+ 1209600 => '2 weeks',
+ 2592000 => '1 month',
+ );
+
+
+ // --------------- \\
+ // SECURITY STUFF \\
+ // --------------- \\
+ $config['use_token'] = false;
+ $config['use_captcha'] = false;
+
+ /* Store visitor data
+ Store visitor data in the database, logging every IP visitng site,
+ and how many times they have visited the site. And sometimes what
+ they do on the site.
+
+ This helps to prevent POST SPAM (like register 1000 accounts in a few seconds)
+ and other things which can stress and slow down the server.
+
+ The only downside is that database can get pretty fed up with much IP data
+ if table never gets flushed once in a while. So I highly recommend you
+ to configure flush_ip_logs if IPs are logged.
+ */
+
+ $config['log_ip'] = true;
+
+ // Flush IP logs each configured seconds, 60 * 15 = 15 minutes.
+ // Set to false to entirely disable ip log flush.
+ // It is important to flush for optimal performance.
+ $config['flush_ip_logs'] = 59 * 27;
+
+ /* IP SECURTY REQUIRE: $config['log_ip'] = true;
+ Configure how tight this security shall be.
+ Etc: You can max click on anything/refresh page
+ [max activity] 15 times, within time period 10
+ seconds. During time_period, you can also only
+ register 1 account and 1 character.
+ */
+ $config['ip_security'] = array(
+ 'time_period' => 10, // In seconds
+ 'max_activity' => 10, // page clicks/visits
+ 'max_post' => 6, // register, create, highscore, character search such actions
+ 'max_account' => 1, // register
+ 'max_character' => 1, // create char
+ 'max_forum_post' => 1, // Create threads and post in forum
+ );
+
+ //////////////
+ /// PAYPAL ///
+ //////////////
+
+ // Write your paypal address here, and what currency you want to recieve money in.
+ $config['paypal'] = array(
+ 'enabled' => true,
+ 'email' => 'Change_Paypal_mail_in_config.php', // Example: paypal@mail.com
+ 'currency' => 'EUR',
+ 'points_per_currency' => 10, // 1 currency = ? points? [ONLY used to calculate bonuses]
+ 'success' => "http://".$_SERVER['HTTP_HOST']."/success.php",
+ 'failed' => "http://".$_SERVER['HTTP_HOST']."/failed.php",
+ 'ipn' => "http://".$_SERVER['HTTP_HOST']."/ipn.php",
+ 'showBonus' => true,
+ );
+
+ // Configure the "buy now" buttons prices, first write price, then how many points you get.
+ // Giving some bonus points for higher donations will tempt users to donate more.
+ $config['paypal_prices'] = array(
+ // price => points,
+ 5 => 45, // -10% bonus
+ 10 => 100, // 0% bonus
+ 15 => 165, // +10% bonus
+ 20 => 240, // +20% bonus
+ 25 => 325, // +30% bonus
+ 30 => 420, // +40% bonus
+ );
+
+ //////////////////
+ /// PAYGOL SMS ///
+ //////////////////
+ // !!! Paygol takes 60%~ of the money, and send aprox 40% to your paypal.
+ // You can configure paygol to send each month, then they will send money to you 1 month after recieving 50+ eur.
+ $config['paygol'] = array(
+ 'enabled' => true,
+ 'serviceID' => 40339,// Service ID from paygol.com
+ 'currency' => 'EUR',
+ 'price' => 5,
+ 'points' => 25, // Remember to write same details in paygol.com!
+ 'name' => '25 points',
+ 'returnURL' => "http://".$_SERVER['HTTP_HOST']."/success.php",
+ 'cancelURL' => "http://".$_SERVER['HTTP_HOST']."/failed.php",
+ 'ipnURL' => "http://".$_SERVER['HTTP_HOST']."/paygol_ipn.php",
+ );
+
+ ////////////
+ /// SHOP ///
+ ////////////
+ // If useDB is set to true, player can shop in-game as well using Znote LUA shop system plugin.
+ $config['shop'] = array(
+ 'enabled' => true,
+ 'enableShopConfirmation' => true, // Verify that user wants to buy with popup
+ 'useDB' => false, // Fetch offers from database, or the below config array
+ 'showImage' => true,
+ 'imageServer' => 'items.znote.eu',
+ 'imageType' => 'gif',
+ );
+
+ // If useDB is false, this array list will be used for shop offers.
+ $config['shop_offers'] = array(
+ // offer 1
+ 1 => array(
+ 'type' => 1, // 1 = item id offers, 2 = premium days [itemid ignored], 3 = sex change[itemid & count ignored], 4+ = custom.
+ 'itemid' => 2160, // item to get in-game
+ 'count' => 5, //if type is 2, this represents premium days
+ 'describtion' => "Crystal coin.", // Describtion shown on website
+ 'points' => 100, // How many points this offer costs
+ ),
+
+ // offer 2
+ 2 => array(
+ 'type' => 1,
+ 'itemid' => 2392,
+ 'count' => 1,
+ 'describtion' => "Fire sword.",
+ 'points' => 10,
+ ),
+
+ // offer 3
+ 3 => array(
+ 'type' => 2,
+ 'itemid' => 12466, // Item to display on page
+ 'count' => 7,
+ 'describtion' => "Premium membership.",
+ 'points' => 25,
+ ),
+
+ // offer 4
+ 4 => array(
+ 'type' => 3,
+ 'itemid' => 12666,
+ 'count' => 3,
+ 'describtion' => "Change character gender.",
+ 'points' => 10,
+ ),
+ 5 => array(
+ 'type' => 3,
+ 'itemid' => 12666,
+ 'count' => 0,
+ 'describtion' => "Change character gender.",
+ 'points' => 20,
+ ),
+ );
+?>
\ No newline at end of file
diff --git a/contact.php b/contact.php
new file mode 100644
index 0000000..b6a5bb8
--- /dev/null
+++ b/contact.php
@@ -0,0 +1,6 @@
+
+
+
Contact
+
TODO: Edit the contact details here.
+
+
\ No newline at end of file
diff --git a/createcharacter.php b/createcharacter.php
new file mode 100644
index 0000000..98924da
--- /dev/null
+++ b/createcharacter.php
@@ -0,0 +1,151 @@
+$value) {
+ if (empty($value) && in_array($key, $required_fields) === true) {
+ $errors[] = 'You need to fill in all fields.';
+ break 1;
+ }
+ }
+
+ // check errors (= user exist, pass long enough
+ if (empty($errors) === true) {
+ if (!Token::isValid($_POST['token'])) {
+ $errors[] = 'Token is invalid.';
+ }
+ $_POST['name'] = validate_name($_POST['name']);
+ if ($_POST['name'] === false) {
+ $errors[] = 'Your name can not contain more than 2 words.';
+ } else {
+ if (user_character_exist($_POST['name']) === true) {
+ $errors[] = 'Sorry, that character name already exist.';
+ }
+ if (!preg_match("/^[a-zA-Z_ ]+$/", $_POST['name'])) {
+ $errors[] = 'Your name may only contain a-z, A-Z and spaces.';
+ }
+ if (strlen($_POST['name']) < $config['minL'] || strlen($_POST['name']) > $config['maxL']) {
+ $errors[] = 'Your character name must be between 4 - 20 characters long.';
+ }
+ // name restriction
+ $resname = explode(" ", $_POST['name']);
+ foreach($resname as $res) {
+ if(in_array(strtolower($res), $config['invalidNameTags'])) {
+ $errors[] = 'Your username contains a restricted word.';
+ }
+ else if(strlen($res) == 1) {
+ $errors[] = 'Too short words in your name.';
+ }
+ }
+ // Validate vocation id
+ if (!in_array((int)$_POST['selected_vocation'], $config['available_vocations'])) {
+ $errors[] = 'Permission Denied. Wrong vocation.';
+ }
+ // Validate town id
+ if (!in_array((int)$_POST['selected_town'], $config['available_towns'])) {
+ $errors[] = 'Permission Denied. Wrong town.';
+ }
+ // Validate gender id
+ if (!in_array((int)$_POST['selected_gender'], array(0, 1))) {
+ $errors[] = 'Permission Denied. Wrong gender.';
+ }
+ if (vocation_id_to_name($_POST['selected_vocation']) === false) {
+ $errors[] = 'Failed to recognize that vocation, does it exist?';
+ }
+ if (town_id_to_name($_POST['selected_town']) === false) {
+ $errors[] = 'Failed to recognize that town, does it exist?';
+ }
+ if (gender_exist($_POST['selected_gender']) === false) {
+ $errors[] = 'Failed to recognize that gender, does it exist?';
+ }
+ // Char count
+ $char_count = user_character_list_count($session_user_id);
+ if ($char_count >= $config['max_characters']) {
+ $errors[] = 'Your account is not allowed to have more than '. $config['max_characters'] .' characters.';
+ }
+ if (validate_ip(getIP()) === false && $config['validate_IP'] === true) {
+ $errors[] = 'Failed to recognize your IP address. (Not a valid IPv4 address).';
+ }
+ }
+ }
+}
+?>
+
+
+
\ No newline at end of file
diff --git a/downloads.php b/downloads.php
new file mode 100644
index 0000000..ee34046
--- /dev/null
+++ b/downloads.php
@@ -0,0 +1,30 @@
+
+
+
Downloads
+
In order to play, you need an compatible IP changer and a Tibia client.
+ In the IP changer, write this in the IP field:
+
+
+ In the IP changer, write this in the Port field:
+
+
+ Now you can successfully login on the tibia client and play.
+ If you do not have an account to login with, you need to register an account HERE.
+
+
+
+
\ No newline at end of file
diff --git a/failed.php b/failed.php
new file mode 100644
index 0000000..f09ae0e
--- /dev/null
+++ b/failed.php
@@ -0,0 +1,4 @@
+
+
Failed!
+
Something went wrong. :(
+
\ No newline at end of file
diff --git a/forum.php b/forum.php
new file mode 100644
index 0000000..9888ee3
--- /dev/null
+++ b/forum.php
@@ -0,0 +1,1046 @@
+
+ 1.2):
+ - Updated to the new date/clock time system
+ - Bootstrap design support.
+*/
+// BBCODE support:
+function TransformToBBCode($string) {
+ $tags = array(
+ '[center]{$1}[/center]' => '
You don\'t have permission to post on this thread. [Thread: Closed]
';
+ } else {
+ ?>
+ Antispam: You need to wait seconds before you can create or post.
+ (time() + $config['forum']['cooldownCreate'])));
+
+ $category = mysql_select_single("SELECT `access`, `closed`, `guild_id` FROM `znote_forum` WHERE `id`='$create_thread_category' LIMIT 1;");
+ if ($category !== false) {
+ $access = true;
+ if (!$admin) {
+ if ($category['access'] > $yourAccess) $access = false;
+ if ($category['guild_id'] > 0) {
+ $status = false;
+ foreach($charData as $char) {
+ if ($char['guild'] == $category['guild_id']) $status = true;
+ }
+ if (!$status) $access = false;
+ }
+ if ($category['closed'] > 0) $access = false;
+ }
+
+ if ($access) {
+ mysql_insert("INSERT INTO `znote_forum_threads`
+ (`forum_id`, `player_id`, `player_name`, `title`, `text`, `created`, `updated`, `sticky`, `hidden`, `closed`)
+ VALUES (
+ '$create_thread_category',
+ '$create_thread_cid',
+ '". $charData[$create_thread_cid]['name'] ."',
+ '$create_thread_title',
+ '$create_thread_text',
+ '". time() ."',
+ '". time() ."',
+ '0', '0', '0');");
+ SendGet(array('cat'=>$create_thread_category), 'forum.php');
+ } else echo '
Permission to create thread denied.
';
+ } else echo 'Category does not exist.';
+ } else {
+ ?>
+ Antispam: You need to wait seconds before you can create or post.
+ post has been updated.';
+ } else echo "
Your permission to edit this post has been denied.
";
+ }
+
+ /////////////////////
+ // When you ARE updating thread
+ if ($update_thread_id !== false && $update_thread_title !== false && $update_thread_text !== false) {
+ // Fetch the thread data
+ $thread = mysql_select_single("SELECT `id`, `player_name`, `title`, `text`, `closed` FROM `znote_forum_threads` WHERE `id`='$update_thread_id' LIMIT 1;");
+
+ // Verify access
+ $access = PlayerHaveAccess($yourChars, $thread['player_name']);
+ if ($thread['closed'] == 1 && $admin === false) $access = false;
+ if ($admin) $access = true;
+
+ if ($access) {
+ mysql_update("UPDATE `znote_forum_threads` SET `title`='$update_thread_title', `text`='$update_thread_text' WHERE `id`='$update_thread_id';");
+ echo '
Thread has been updated.
';
+ } else echo "
Your permission to edit this thread has been denied.
";
+ }
+
+ /////////////////////
+ // When you want to edit a post
+ if ($edit_post_id !== false && $edit_post !== false) {
+ // Fetch the post data
+ $post = mysql_select_single("SELECT `id`, `thread_id`, `text`, `player_name` FROM `znote_forum_posts` WHERE `id`='$edit_post_id' LIMIT 1;");
+ $thread = mysql_select_single("SELECT `closed` FROM `znote_forum_threads` WHERE `id`='". $post['thread_id'] ."' LIMIT 1;");
+ // Verify access
+ $access = PlayerHaveAccess($yourChars, $post['player_name']);
+ if ($thread['closed'] == 1 && $admin === false) $access = false;
+ if ($admin) $access = true;
+
+ if ($access) {
+ ?>
+
Edit Post
+
+ You don\'t have permission to edit this post.';
+ } else
+
+ /////////////////////
+ // When you want to edit a thread
+ if ($edit_thread_id !== false && $edit_thread !== false) {
+ // Fetch the thread data
+ $thread = mysql_select_single("SELECT `id`, `title`, `text`, `player_name`, `closed` FROM `znote_forum_threads` WHERE `id`='$edit_thread_id' LIMIT 1;");
+
+ $access = PlayerHaveAccess($yourChars, $thread['player_name']);
+ if ($thread['closed'] == 1) $access = false;
+ if ($admin) $access = true;
+
+ if ($access) {
+ ?>
+
Edit Thread
+
+ Edit access denied.';
+ } else
+
+ /////////////////////
+ // When you want to view a thread
+ if ($getThread !== false) {
+ $getThread = (int)$getThread;
+ $threadData = mysql_select_single("SELECT `id`, `forum_id`, `player_id`, `player_name`, `title`, `text`, `created`, `updated`, `sticky`, `hidden`, `closed` FROM `znote_forum_threads` WHERE `id`='$getThread' LIMIT 1;");
+
+ if ($threadData !== false) {
+
+ $category = mysql_select_single("SELECT `hidden`, `access`, `guild_id` FROM `znote_forum` WHERE `id`='". $threadData['forum_id'] ."' LIMIT 1;");
+ if ($category === false) die("Thread category does not exist.");
+
+ $access = true;
+ $leader = false;
+ if ($category['hidden'] == 1 || $category['access'] > 1 || $category['guild_id'] > 0) {
+ $access = false;
+ if ($category['hidden'] == 1) $access = PlayerHaveAccess($yourChars, $threadData['player_name']);
+ if ($category['access'] > 1 && $yourAccess >= $category['access']) $access = true;
+ foreach($charData as $char) {
+ if ($category['guild_id'] == $char['guild']) $access = true;
+ if ($char['guild_rank'] == 3) $leader = true;
+ }
+ if ($admin) $access = true;
+ }
+
+
+ if ($access) {
+ ?>
+ LinkMap: Forum -
+ Viewing thread: ". $threadData['title'] .""; ?>
+
+
+
+
+
+
+ 0) {
+ if ($threadData['closed'] == 0 || $yourAccess > 3) {
+ ?>
+
+ You don\'t have permission to post on this thread. [Thread: Closed]';
+ } else {
+ ?>
You must have a character on your account that is level + to reply to this thread.
Your permission to access this thread has been denied.";
+ } else {
+ ?>
+
Thread unavailable
+
Thread is unavailable for you, or do not exist any more.
+ 0 && !empty($_GET['forum'])) {
+ $tmpCat = getValue($_GET['cat']);
+ $tmpCatName = getValue($_GET['forum']);
+ ?>
+ Go back to:
+
+ Go back to Forum
+
+ $yourAccess) $access = false;
+ if ($category['guild_id'] > 0) {
+ $status = false;
+ foreach($charData as $char) {
+ if ($char['guild'] == $category['guild_id']) $status = true;
+ }
+ if (!$status) $access = false;
+ }
+ if ($category['closed'] > 0) $access = false;
+ }
+
+ if ($access) {
+ ?>
+
Create new thread
+
+ Permission to create thread denied.';
+ }
+ } else
+
+ /////////////////////
+ // When category is specified
+ if ($getCat !== false) {
+ $getCat = (int)$getCat;
+
+ // Fetch category rules
+ $category = mysql_select_single("SELECT `name`, `access`, `closed`, `hidden`, `guild_id` FROM `znote_forum` WHERE `id`='$getCat' AND `access`<='$yourAccess' LIMIT 1;");
+
+ if ($category !== false && $category['guild_id'] > 0 && !$admin) {
+ $access = false;
+ foreach($charData as $char) if ($category['guild_id'] == $char['guild']) $access = true;
+ if ($access !== true) $category = false;
+ }
+
+ if ($category !== false) {
+ // TODO : Verify guild access
+ //foreach($charData)
+ echo "
+ 0) {
+ if ($category['closed'] == 0 || $admin) {
+ ?>
+
+ This board is closed.';
+ } else echo "
You must have a character on your account that is level ". $config['forum']['level'] ."+ to create new threads.
";
+ } else echo "
Your permission to access this board has been denied. If you are trying to access a Guild Board, you need level: ". $config['forum']['level'] ."+
";
+
+ }
+} else {
+
+ //////////////////////
+ // No category specified, show list of available categories
+ if (!$admin) $categories = mysql_select_multi(
+ "SELECT `id`, `name`, `access`, `closed`, `hidden`, `guild_id` FROM `znote_forum` WHERE `access`<='$yourAccess' ORDER BY `name`;");
+ else $categories = mysql_select_multi("SELECT `id`, `name`, `access`, `closed`, `hidden`, `guild_id` FROM `znote_forum` ORDER BY `name`;");
+
+ $guildboard = false;
+ ?>
+
+
+
Forum Boards
+ 0) $guild = true;
+ }
+
+ if ($admin || $guild) {
+ if (!isset($guilds)) {
+ $guilds = mysql_select_multi("SELECT `id`, `name` FROM `guilds` ORDER BY `name`;");
+ $guilds[] = array('id' => '0', 'name' => 'No guild');
+ }
+ $guildName = array();
+ foreach($guilds as $guild) {
+ $guildName[$guild['id']] = $guild['name'];
+ }
+ if ($admin) {
+ ?>
+
+
+
\ No newline at end of file
diff --git a/gallery.php b/gallery.php
new file mode 100644
index 0000000..adec8a9
--- /dev/null
+++ b/gallery.php
@@ -0,0 +1,105 @@
+
+
Create image article
+
Only works with "Direct link" URLs from imgland.net
+ Don't understand? Don't worry! Watch this video guide!
+
+
+
Image Posted
+
However, your image will not be listed until a GM have verified it.
+ Feel free to remind the GM in-game to login on website and approve the image post.
+Guild list is empty.';?>
+
+= $config['create_guild_level']) {
+
+ // If character is offline
+ if ($char_data['online'] == 0) {
+ $acc_data = user_data($user_data['id'], 'premdays');
+
+ // If character is premium
+ if ($config['guild_require_premium'] == false || $acc_data['premdays'] > 0) {
+
+ if (get_character_guild_rank($user_id) < 1) {
+
+ if (preg_match("/^[a-zA-Z_ ]+$/", $_POST['guild_name'])) {
+ // Only allow normal symbols as guild name
+
+ $guildname = sanitize($_POST['guild_name']);
+
+ $gid = get_guild_id($guildname);
+ if ($gid === false) {
+ create_guild($user_id, $guildname);
+ header('Location: success.php');
+ exit();
+ } else echo 'A guild with that name already exist.';
+ } else echo 'Guild name may only contain a-z, A-Z and spaces.';
+ } else echo 'You are already in a guild.';
+ } else echo 'You need a premium account to create a guild.';
+ } else echo 'Your character must be offline to create a guild.';
+ } else echo $name .' is level '. $char_data['level'] .'. But you need level '. $config['create_guild_level'] .'+ to create your own guild!';
+ }
+ }
+ // end
+ ?>
+
+
+
+
+
+
+
+
+ $highest_access) $highest_access = $access;
+ }
+ }
+ }
+ }
+ }
+ // Display the specific guild page
+?>
+
+
+
+
+
\ No newline at end of file
diff --git a/guildwar.php b/guildwar.php
new file mode 100644
index 0000000..4de33e1
--- /dev/null
+++ b/guildwar.php
@@ -0,0 +1,185 @@
+
+
+
+
\ No newline at end of file
diff --git a/login.php b/login.php
new file mode 100644
index 0000000..226e0ed
--- /dev/null
+++ b/login.php
@@ -0,0 +1,60 @@
+ 32 || strlen($password) > 64) {
+ $errors[] = 'Username or password is too long.';
+ } else if (user_exist($username) === false) {
+ $errors[] = 'Failed to authorize your account, are the details correct, have you registered?';
+ } /*else if (user_activated($username) === false) {
+ $errors[] = 'You havent activated your account! Please check your email. Note it may appear in your junk/spam box.';
+ } */else if (!Token::isValid($_POST['token'])) {
+ Token::debug($_POST['token']);
+ $errors[] = 'Token is invalid.';
+ } else {
+
+ // Starting loging
+ if ($config['TFSVersion'] == 'TFS_02' || $config['TFSVersion'] == 'TFS_10') $login = user_login($username, $password);
+ else if ($config['TFSVersion'] == 'TFS_03') $login = user_login_03($username, $password);
+ else $login = false;
+ if ($login === false) {
+ $errors[] = 'Username and password combination is wrong.';
+ } else {
+ $_SESSION['user_id'] = $login;
+
+ // if IP is not set (etc acc created before Znote AAC was in use)
+ $znote_data = user_znote_account_data($_SESSION['user_id']);
+ if ($znote_data['ip'] == 0) {
+ $update_data = array(
+ 'ip' => ip2long(getIP()),
+ );
+ user_update_znote_account($update_data);
+ }
+
+ // Send them to myaccount.php
+ header('Location: myaccount.php');
+ exit();
+ }
+ }
+} else {
+ header('Location: index.php');
+}
+
+if (empty($errors) === false) {
+?>
+
We tried to log you in, but...
+
\ No newline at end of file
diff --git a/logout.php b/logout.php
new file mode 100644
index 0000000..bcfac9b
--- /dev/null
+++ b/logout.php
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/mailtest.php b/mailtest.php
new file mode 100644
index 0000000..6eb98b4
--- /dev/null
+++ b/mailtest.php
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/myaccount.php b/myaccount.php
new file mode 100644
index 0000000..a513f0a
--- /dev/null
+++ b/myaccount.php
@@ -0,0 +1,258 @@
+ 0 && $infinite === false) $tks += (int)$ticket['count'];
+ }
+ if ($infinite === true) $tks = 0;
+ $dbid = (int)$tickets[0]['id'];
+ // If they dont have unlimited tickets, remove a count from their ticket.
+ if ($tickets[0]['count'] > 1) { // Decrease count
+ $tks--;
+ $tkr = ((int)$tickets[0]['count'] - 1);
+ shop_update_row_count($dbid, $tkr);
+ } else if ($tickets[0]['count'] == 1) { // Delete record
+ shop_delete_row_order($dbid);
+ $tks--;
+ }
+
+ // Change character gender:
+ //
+ user_character_change_gender($char_name);
+ echo 'You have successfully changed gender on character '. $char_name .'.';
+ if ($tks > 0) echo ' You have '. $tks .' gender change tickets left.';
+ else if ($infinite !== true) echo ' You are out of tickets.';
+ } else echo 'You don\'t have any character gender tickets, buy them in the SHOP!';
+ } else echo 'Your character must be offline.';
+ }
+}
+// end
+// Change character comment PAGE1:
+if (!empty($_POST['selected_comment'])) {
+ if (!Token::isValid($_POST['token'])) {
+ exit();
+ }
+ if (user_character_account_id($_POST['selected_comment']) === $session_user_id) {
+ $comment_data = user_znote_character_data(user_character_id($_POST['selected_comment']), 'comment');
+ ?>
+
+
+
\ No newline at end of file
diff --git a/onlinelist.php b/onlinelist.php
new file mode 100644
index 0000000..52585aa
--- /dev/null
+++ b/onlinelist.php
@@ -0,0 +1,31 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/paygol_ipn.php b/paygol_ipn.php
new file mode 100644
index 0000000..686e79d
--- /dev/null
+++ b/paygol_ipn.php
@@ -0,0 +1,85 @@
+ 1) {
+ unset($func_get_args[0]);
+
+ $fields = '`'. implode('`, `', $func_get_args) .'`';
+ $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `accounts` WHERE `id` = $user_id;"));
+ return $data;
+ }
+ }
+ // Since only paygol.com is able to communicate with this script, we will blindly trust them until proven othervise.
+ if ($service_id == $paygol['serviceID']) {
+ $new_points = (int)$paygol['points'];
+
+ $data = user_data($custom, 'name');
+ if ($data['name']) {
+ // Sanitize all data: (ok, we do not completely trust them blindly. D:)
+ $message_id = sanitize($message_id);
+ $service_id = sanitize($service_id);
+ $shortcode = sanitize($shortcode);
+ $keyword = sanitize($keyword);
+ $message = sanitize($message);
+ $sender = sanitize($sender);
+ $operator = sanitize($operator);
+ $country = sanitize($country);
+ $custom = sanitize($custom);
+ $points = sanitize($points);
+ $price = sanitize($price);
+ $currency = sanitize($currency);
+
+ // Update logs:
+ $log_query = mysql_query("INSERT INTO `znote_paygol` VALUES ('', '$custom', '$price', '$new_points', '$message_id', '$service_id', '$shortcode', '$keyword', '$message', '$sender', '$operator', '$country', '$currency')")or die("Log paygol SQL ERROR");
+
+ // Give points to user
+ $old_points = mysql_result(mysql_query("SELECT `points` FROM `znote_accounts` WHERE `account_id`='$custom';"), 0, 'points');
+ echo 'Custom: '. $custom .' ';
+ echo "Query: SELECT `points` FROM `znote_accounts` WHERE `account_id`='$custom'; ";
+ echo 'Old points: '. $old_points .' ';
+ $new_points += $old_points;
+ echo 'New points: '. $new_points .' ';
+ $update_account = mysql_query("UPDATE `znote_accounts` SET `points`='$new_points' WHERE `account_id`='$custom'")or die(mysql_error());
+ echo 'Account id 2 shold be updated now!';
+
+ } else echo ' character data false';
+
+ } else echo 'service id wrong';
+?>
\ No newline at end of file
diff --git a/protected.php b/protected.php
new file mode 100644
index 0000000..fe14e7b
--- /dev/null
+++ b/protected.php
@@ -0,0 +1,20 @@
+
+
+
STOP!
+
Ummh... Why are you sniffing around here?
+
+
+
+
Sorry, you need to be logged in to do that!
+
Please register or log in.
+
+
\ No newline at end of file
diff --git a/queststatus.php b/queststatus.php
new file mode 100644
index 0000000..30bab2a
--- /dev/null
+++ b/queststatus.php
@@ -0,0 +1,54 @@
+
+ $quest) {
+
+ // Is quest NOT an array (advanced quest?)
+ if (!is_array($quest)) {
+ // Query to find quest results
+ $query = mysql_select_single("SELECT `value` FROM `player_storage` WHERE `key`='$quest' AND `player_id`='$user_id' AND `value`='1' LIMIT 1;");
+
+ if ($query !== false) $quest = $completed;
+ else $quest = $notstarted;
+
+ } else {
+ $query = mysql_select_single("SELECT `value` FROM `player_storage` WHERE `key`='".$quest[0]."' AND `player_id`='$user_id' AND `value`>'0' LIMIT 1;");
+ if (!$query) $quest = $notstarted;
+ else {
+ if ($query['value'] >= $quest[1]) $quest = $completed;
+ else $quest = Progress($query['value'], $quest[1]);
+ }
+ }
+ ?>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/recovery.php b/recovery.php
new file mode 100644
index 0000000..d07541b
--- /dev/null
+++ b/recovery.php
@@ -0,0 +1,92 @@
+
+
+
Account Recovery
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/register.php b/register.php
new file mode 100644
index 0000000..4072c97
--- /dev/null
+++ b/register.php
@@ -0,0 +1,171 @@
+$value) {
+ if (empty($value) && in_array($key, $required_fields) === true) {
+ $errors[] = 'You need to fill in all fields.';
+ break 1;
+ }
+ }
+
+ // check errors (= user exist, pass long enough
+ if (empty($errors) === true) {
+ /* Token used for cross site scripting security */
+ if (!Token::isValid($_POST['token'])) {
+ $errors[] = 'Token is invalid.';
+ }
+
+ if ($config['use_captcha']) {
+ include_once 'captcha/securimage.php';
+ $securimage = new Securimage();
+ if ($securimage->check($_POST['captcha_code']) == false) {
+ $errors[] = 'Captcha image verification was submitted wrong.';
+ }
+ }
+
+ if (user_exist($_POST['username']) === true) {
+ $errors[] = 'Sorry, that username already exist.';
+ }
+
+ // Don't allow "default admin names in config.php" access to register.
+ $isNoob = in_array(strtolower($_POST['username']), $config['page_admin_access']) ? true : false;
+ if ($isNoob) {
+ $errors[] = 'This account name is blocked for registration.';
+ }
+ if (strtolower($_POST['username']) === true) {
+ $errors[] = 'Sorry, that username already exist.';
+ }
+ if (preg_match("/^[a-zA-Z0-9]+$/", $_POST['username']) == false) {
+ $errors[] = 'Your account name can only contain characters a-z, A-Z and 0-9.';
+ }
+ // name restriction
+ $resname = explode(" ", $_POST['username']);
+ foreach($resname as $res) {
+ if(in_array(strtolower($res), $config['invalidNameTags'])) {
+ $errors[] = 'Your username contains a restricted word.';
+ }
+ else if(strlen($res) == 1) {
+ $errors[] = 'Too short words in your name.';
+ }
+ }
+ // end name restriction
+ if (strlen($_POST['password']) < 6) {
+ $errors[] = 'Your password must be at least 6 characters.';
+ }
+ if (strlen($_POST['password']) > 33) {
+ $errors[] = 'Your password must be less than 33 characters.';
+ }
+ if ($_POST['password'] !== $_POST['password_again']) {
+ $errors[] = 'Your passwords do not match.';
+ }
+ if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
+ $errors[] = 'A valid email address is required.';
+ }
+ if (user_email_exist($_POST['email']) === true) {
+ $errors[] = 'That email address is already in use.';
+ }
+ if ($_POST['selected'] != 1) {
+ $errors[] = 'You are only allowed to have an account if you accept the rules.';
+ }
+ if (validate_ip(getIP()) === false && $config['validate_IP'] === true) {
+ $errors[] = 'Failed to recognize your IP address. (Not a valid IPv4 address).';
+ }
+ }
+}
+
+?>
+
+
+
\ No newline at end of file
diff --git a/settings.php b/settings.php
new file mode 100644
index 0000000..82c6e81
--- /dev/null
+++ b/settings.php
@@ -0,0 +1,69 @@
+$value) {
+ if (empty($value) && in_array($key, $required_fields) === true) {
+ $errors[] = 'You need to fill in all fields.';
+ break 1;
+ }
+ }
+
+ if (empty($errors) === true) {
+ if (filter_var($_POST['new_email'], FILTER_VALIDATE_EMAIL) === false) {
+ $errors[] = 'A valid email address is required.';
+ } else if (user_email_exist($_POST['new_email']) === true && $user_data['email'] !== $_POST['new_email']) {
+ $errors[] = 'That email address is already in use.';
+ }
+ }
+
+ print_r($errors);
+}
+?>
+
Settings
+
+ $_POST['new_email'],
+ );
+
+ user_update_account($update_data);
+ header('Location: settings.php?success');
+ exit();
+
+ } else if (empty($errors) === false) {
+ echo output_errors($errors);
+ }
+ ?>
+
+
+
\ No newline at end of file
diff --git a/shop.php b/shop.php
new file mode 100644
index 0000000..518a079
--- /dev/null
+++ b/shop.php
@@ -0,0 +1,129 @@
+ $value) {
+ if ($key === $post) {
+ $buy = $value;
+ }
+ }
+ if ($buy === false) die("Error: Shop offer ID mismatch.");
+
+ // Verify that user can afford this offer.
+ if ($player_points >= $buy['points']) {
+ $old_points = mysql_result(mysql_query("SELECT `points` FROM `znote_accounts` WHERE `account_id`='$cid';"), 0, 'points');
+ if ((int)$old_points != (int)$player_points) die("1: Failed to equalize your points.");
+ // Remove points if they can afford
+ // Give points to user
+ $expense_points = $buy['points'];
+ $new_points = $old_points - $expense_points;
+ $update_account = mysql_query("UPDATE `znote_accounts` SET `points`='$new_points' WHERE `account_id`='$cid'");
+
+ $verify = mysql_result(mysql_query("SELECT `points` FROM `znote_accounts` WHERE `account_id`='$cid';"), 0, 'points');
+ if ((int)$old_points == (int)$verify) die("2: Failed to equalize your points.". var_dump((int)$old_points, (int)$verify, $new_points, $expense_points));
+
+ // Do the magic (insert into db, or change sex etc)
+ // If type is 2 or 3
+ if ($buy['type'] == 2) {
+ // Add premium days to account
+ user_account_add_premdays($cid, $buy['count']);
+ echo 'You now have '.$buy['count'].' additional days of premium membership.';
+ } else if ($buy['type'] == 3) {
+ // Character sex
+ mysql_query("INSERT INTO `znote_shop_orders` (`account_id`, `type`, `itemid`, `count`, `time`) VALUES ('$cid', '". $buy['type'] ."', '". $buy['itemid'] ."', '". $buy['count'] ."', '$time')") or die(mysql_error());
+ echo 'You now have access to change character gender on your characters. Visit My Account to select character and change the gender.';
+ } else {
+ mysql_query("INSERT INTO `znote_shop_orders` (`account_id`, `type`, `itemid`, `count`, `time`) VALUES ('$cid', '". $buy['type'] ."', '". $buy['itemid'] ."', '". $buy['count'] ."', '$time')") or die(mysql_error());
+ echo 'Your order is ready to be delivered. Write this command in-game to get it: [!shop]. Make sure you are in depot and can carry it before executing the command!';
+ }
+
+ // No matter which type, we will always log it.
+ mysql_query("INSERT INTO `znote_shop_logs` (`account_id`, `player_id`, `type`, `itemid`, `count`, `points`, `time`) VALUES ('$cid', '0', '". $buy['type'] ."', '". $buy['itemid'] ."', '". $buy['count'] ."', '". $buy['points'] ."', '$time')") or die(mysql_error());
+
+ } else echo 'You need more points, this offer cost '.$buy['points'].' points.';
+ //var_dump($buy);
+ //echo ''. $_POST['buy'] .'';
+}
+
+if ($shop['enabled']) {
+?>
+
+
';
+
+include 'layout/overall/footer.php'; ?>
\ No newline at end of file
diff --git a/success.php b/success.php
new file mode 100644
index 0000000..15ed4df
--- /dev/null
+++ b/success.php
@@ -0,0 +1,3 @@
+
+
Success!
+
\ No newline at end of file
diff --git a/support.php b/support.php
new file mode 100644
index 0000000..8693444
--- /dev/null
+++ b/support.php
@@ -0,0 +1,52 @@
+
Support in-game
hasExpired()) {
+ // Fetch all staffs in-game.
+ $staffs = support_list();
+ // Fetch group ids and names from config.php
+ $groups = $config['ingame_positions'];
+ // Loops through groups, separating each group element into an ID variable and name variable
+ foreach ($groups as $group_id => $group_name) {
+ // Loops through list of staffs
+ if (!empty($staffs))
+ foreach ($staffs as $staff) {
+ if ($staff['group_id'] == $group_id) $srtGrp[$group_name][] = $staff;
+ }
+ }
+ if (!empty($srtGrp)) {
+ $cache->setContent($srtGrp);
+ $cache->save();
+ }
+} else {
+ $srtGrp = $cache->load();
+}
+$writeHeader = true;
+if (!empty($srtGrp)) {
+ foreach (array_reverse($srtGrp) as $grpName => $grpList) {
+ ?>
+
+ '; include 'layout/overall/footer.php'; ?>
\ No newline at end of file
diff --git a/twtrNews.php b/twtrNews.php
new file mode 100644
index 0000000..eb7103e
--- /dev/null
+++ b/twtrNews.php
@@ -0,0 +1,10 @@
+Tweets from @ZnoteAAC
+