Archive for SMF (Simple Machine Forum)

How to Help Users Easily Embed Videos on an SMF Site

Posted in SMF (Simple Machine Forum) by ShortLikeAFox on August 10th, 2008

So you are in charge of setting up a Simple Machines Forum based site and want a foolproof way to allow users to embed videos from popular video sites (YouTube, Google Video, IGN, etc.). You may justifiably be afraid in allowing users to simply use the embed code from those individual sites, because God knows what the results will be. The solution to this problem is as simple as can be. Karl Benson wrote a modification package that makes video embedding as simple as cutting and pasting the URL of the page the video appears in. This package works for over 150 sites and is called AEVAC (Audio Embed Video/Audio Clips). The most recent release is version 3.1.2 and it can be found here.

This is a mod I highly recommend. Used correctly it has the potential to greatly reduce the frequency and severity of forum administrator headaches.

How to Manually Insert a Group of Users Into an SMF Forum Using PHP

Posted in SMF (Simple Machine Forum), php by ShortLikeAFox on July 30th, 2008

This Tutorial assumes you are familiar with my post: How to Manually Insert a User Into an SMF Forum Using PHP.

I recently faced the challenge of moving 800 or so bands from a database into an SMF forum. I faced a couple of problems when making the move that I didn’t cover in the first post:

  1. The band names weren’t guaranteed to be safe for a character by character move into the SMF database. So some kind of name modifying function had to be employed.
  2. The bands don’t have passwords. So some type of password generation needs to be employed.

The steps I went about to register all of the bands in the forum went a little like this:

Open the Band Database

for each (Band){

Generate Password

Rename Band with "safe" name

Grab and generate information needed to insert the user

Insert Band into smf_members

Send Band an email with the password

}

Information I had available from the band database that was useful included: bandName, bandEmail, and bandWebsite

Here is the password generation function I used (blatently taken from totallyphp.co.uk):

function createRandomPassword() {

$chars = "abcdefghijkmnopqrstuvwxyz023456789";

srand((double)microtime()*1000000);

$i = 0;

$pass = ” ;

 

while ($i <= 7) {

$num = rand() % 33;

$tmp = substr($chars, $num, 1);

$pass = $pass . $tmp;

$i++;

}

return $pass;

}

The password created here is relatively weak, but it was good enough for my purposes. Any password generation function would work fine here. I chose this one because it would be easy for members to remember if they chose not to change it.

How to Do It:

//First connect to the band database
$username = "bandUsername ";
$host = "bandHost";
$mypassword = "bandPassword";
$db_name = "bandDatabase";

mysql_connect("$host", "$username", "$mypassword")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select DB");

//Now grab all of the bands from the database
$query = "SELECT * FROM allBands ";
$bands = mysql_query($query) or die ("Config Error 2222b");
$userRows = mysql_num_rows($bands);

//Now lets connect to the smf db
$host="smfhost"; // Host name
$username="smfuser; // Mysql username
$mypassword="smfpassword"; // Mysql password
$db_name="smfdatabase"; // Database name

mysql_connect("$host", "$username", "$mypassword")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select DB");

//$vaild_chars is going to be the array of allowed characters for usernames. I decided to only allow letters and numbers. There are other characters that could be used that wouldn’t cause a problem, but for style reasons I decided to go with only letters and numbers
$valid_chars = "a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9";
$valid_chars = explode(" ",$valid_chars);

//Now we need to loop through each band

for ($i = 0; $i < $userRows; $i++){

if ($row = mysql_fetch_assoc($bands)){

//Extract the band information
extract
($row);
//Create a password for the band
$realPassword = createRandomPassword();
//I choose to echo the bandname and password as part of my debugging and so I can see the function as it works
echo("<br/>$bandName - $realPassword");
$newBand = "";
//For each letter in the band name we are going to look to see if it matches a valid character from $valid_chars. It it does not we are going to get rid of it and truncate the band name
for ($j = 0; $j < strlen($bandName); $j++){

$temp = str_replace($valid_chars, "X", strtolower($band[$j]));
if ($temp == "X")

$newBand = $newBand.$band[$j];

}
//I echo the new name for the same reason I echo the old name and password
echo(" - $newBand");
//We have the new Band name…. now let’s start buliding the info we need to insert in the db…
$memberName = $newBand;
$realName = $newBand; //I set the real name and member name the same. The bands can change it if they want
$emailAddress = $bandEmail;
$websiteUrl = $bandWebsite; //Since I have the bands’ websites might as well enter them
$websiteTitle = $newBand;
$is_activated = 1;
$ID_POST_GROUP = 4;
$password = sha1(strtolower($memberName).$realPassword); //Password must be encrypted

//Make sure their isn’t a member with the same name in the SMF database. We don’t want to accidentally enter anyone twice
$query = "SELECT * FROM smf_members WHERE memberName = ‘$memberName’";
$result = mysql_query($query) or die ("Config Error 2222343242b");
$nrows = mysql_num_rows($result);

//If the member name is found do nothing
if ($nrows>0){}

else {

//If the user isn’t already signed up for the forums, do so and send an email….
$query = "INSERT INTO smf_members(memberName, realName, emailAddress, is_activated, ID_POST_GROUP, passwd, websiteUrl, websiteTitle ) VALUES(’$memberName’, ‘$realName’, ‘$emailAddress’, ‘$is_activated’, ‘$ID_POST_GROUP’, ‘$password’, ‘$websiteUrl’, ‘$websiteTitle’)";

$result = mysql_query($query) or die ("Config Error 2232 ");

//Now we need to send the band an email
$to=$emailAddress;
$subject="Your forum username and password ";

// From
$header="from: Me <me@mysite.com>";

// Your message
$message.="Your login and password are listed below. You can change either at anytime. If you don’t want to participate in our forums, that’s no problem. Just never log in and it will be like nothing ever happened.\r\n";
$message.="Username: $memberName Password: $realPassword \r\n";

// send email
$sentmail = mail($to,$subject,$message,$header);
if ($sentmail)

echo("- YES!");
//This is the last part of our echo. The " -YES!" will only be printed if an email is sent. So a full printout line will look something like this:
//Adam Strife - 4s6vsxag - AdamStrife - YES!

}

}
}

How to Manually Insert a User Into an SMF Forum Using PHP

Posted in SMF (Simple Machine Forum), php by ShortLikeAFox on July 28th, 2008

This specific example is for SMF 1.1.5. I can’t guarantee it will work with any other version.

So you run Simple Machine Forum Software and want to manually enter a user? No problem. I know this problem seems very specific, but the ideas explained here can be adapted to other types of forums and other database driven software packages such as Wordpress. Before we get into exactly how to do this, let’s take a look at how Simple Machine Forums keeps track of users. In the SMF database there is a table called smf_members. The smf_members structure looks like this:

Field Type Null

Key Default Extra
ID_MEMBER mediumint(8) unsigned NO PRI NULL auto_increment
memberName varchar(80) NO MUL    
dateRegistered int(10) unsigned NO MUL 0  
posts mediumint(8) unsigned NO MUL 0  
ID_GROUP smallint(5) unsigned NO MUL 0  
lngfile tinytext NO MUL    
lastLogin int(10) unsigned NO MUL 0  
realName tinytext NO      
instantMessages smallint(5) NO   0  
unreadMessages smallint(5) NO   0  
buddy_list text NO      
pm_ignore_list text NO      
messageLabels text NO      
passwd varchar(64) NO      
emailAddress tinytext NO      
personalText tinytext NO      
gender tinyint(4) unsigned NO   0  
birthdate date NO MUL 0001-01-01  
websiteTitle tinytext NO      
websiteUrl tinytext NO      
location tinytext NO      
ICQ tinytext NO      
AIM varchar(16) NO      
YIM varchar(32) NO      
MSN tinytext NO      
hideEmail tinyint(4) NO   0  
showOnline tinyint(4) NO   1  
timeFormat varchar(80) NO      
signature text NO      
timeOffset float NO   0  
avatar tinytext NO      
pm_email_notify tinyint(4) NO   0  
karmaBad smallint(5) unsigned NO   0  
karmaGood smallint(5) unsigned NO   0  
usertitle tinytext NO      
notifyAnnouncements tinyint(4) NO   1  
notifyOnce tinyint(4) NO   1  
notifySendBody tinyint(4) NO   0  
notifyTypes tinyint(4) NO   2  
memberIP tinytext NO      
memberIP2 tinytext NO      
secretQuestion tinytext NO      
secretAnswer varchar(64) NO      
ID_THEME tinyint(4) unsigned NO   0  
is_activated tinyint(3) unsigned NO   1  
validation_code varchar(10) NO      
ID_MSG_LAST_VISIT int(10) unsigned NO   0  
additionalGroups tinytext NO      
smileySet varchar(48) NO      
ID_POST_GROUP smallint(5) unsigned NO MUL 0  
totalTimeLoggedIn int(10) unsigned NO   0  
passwordSalt varchar(5) NO      

Fields we need to pay attention to:

  • memberName - Self Explanitory.
  • dateRegistered - Isn’t neccessary, but if not filled out the date registered displays as December 31st 1969. The date is saved as an epoch timestamp. Don’t know how to calculate timestamps in your head? No problem. I use the free generator found here.
  • realName - Should be inserted. When I’m not sure I just repeat memberName here.
  • emailAddress - Self Explanitory.
  • is_activated - Must be set to 1 since we are manually activating a member.
  • ID_POST_GROUP - I won’t lie. I’m not sure what this is, but it always seems to be set to 4. So…. I always set it to 4. Not the best way to program, but what can you do?
  • passwd - The password you want to give the new user. It is impossible to figure out how to enter without looking at the SMF documentation. The proper code to encrypt a SMF password for the database looks like this:

$passwd = sha1(strtolower($memberName).$password)

In the above line of code, $password is the user’s actual password.

How to Do It:

//First, connect to the SMF database

$host="hostname"; // Host name
$username="username"; // Mysql username
$mypassword="password"; // Mysql password
$db_name="username"; // Database name

mysql_connect("$host", "$username", "$mypassword")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select DB");

$memberName = "ironMan";
$realName = "Tony Stark";
$emailAddress = "ironMan@ironMan.com";
$is_activated = 1;
$ID_POST_GROUP = 4;

$password = “Tony1234″;

$password = sha1(strtolower($memberName).$password);

$dateRegistered = 1216951200; // 7-25-2008 2 AM

$query = "INSERT INTO smf_members(memberName, realName, emailAddress, is_activated, ID_POST_GROUP, passwd, dateRegistered) VALUES(’$memberName’, ‘$realName’, ‘$emailAddress’, ‘$is_activated’, ‘$ID_POST_GROUP’, ‘$password’, ‘$dateRegistered’)";
$result = mysql_query($query) or die ("SMF Error 101.234 ");

That’s all there is to it!