PM On Registration

Started by JayBachatero, July 16, 2006, 03:06:18 AM

Previous topic - Next topic

JayBachatero

What is the link to your forum?  Cna you please clear out all of your error logs?  I'm going to register.  When I do I will let you know so that you can check the error log.
Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

littleone

It still shows the "sender" of the PM as a quest and when you hit reply it still leaves the reply to field blank.

Thanks

JayBachatero

littleone can you PM me a test admin account?
Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

PrizeLive.com

Version 1.1 RC2

I entered in 1 as the userid, it's mine (the admin).. and I created a test account and it shows it coming from a Guest...
Get Paid Instantly via PayPal (or other options) at PrizeLive.com!

MartinB

Quote from: Jay The Code Monkey on July 17, 2006, 06:27:54 PM
What is the link to your forum?  Cna you please clear out all of your error logs?  I'm going to register.  When I do I will let you know so that you can check the error log.

The problem is found. Since I had to use the Mod by hand, I had inadvertently forgotten a line. Now it folds in the best way. Super Mod. Thanks

littleone

Quote from: Jay The Code Monkey on July 17, 2006, 06:36:01 PM
littleone can you PM me a test admin account?

Don't take it personally but I trust doing such a thing.  If you want me to try something or need to see some coding I will be more than happy to help you with that.

Webrunner

Quote from: Jay The Code Monkey on July 16, 2006, 09:37:54 PM

Uninstall the mod and try again.  I was able to get it working a few forums.


That didn't work.
Still get a lot of error messages and a database error in my error log.

Here is the last error:


Databaseerror: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')
ORDER BY mem.lngfile
LIMIT 0' at line 9
File: /home/website/html/forum/Sources/Subs-Post.php
Line: 713


Any ideas?
There is a difference between knowing the path and walking the path.

=========================================
Vrouwen Power! | Sprintweb: No nonsense e-Business consultancy

littleone

Errors I am getting on action=register2:

2: in_array(): Wrong datatype for second argument
File: /home/xxxxxx/public_html/forum/Sources/Subs-Post.php
Line: 757


2: array_diff(): Argument #1 is not an array
File: /home/xxxxxxxx/public_html/forum/Sources/Subs-Post.php
Line: 693


2: array_unique(): The argument should be an array
File: /home/xxxxxxx/public_html/forum/Sources/Subs-Post.php
Line: 693


8: Undefined index: bcc
File: /home/xxxxxxxx/public_html/forum/Sources/Subs-Post.php
Line: 693

JayBachatero

Ok I finally found the bug.  It seems that the upgrade was messed up a bit.  I forgot to change the line that it the the userid to the provided id instead of 0.

This bug only exists if you had 1.0 originally installed and upgraded to 1.0.1.  It seems like I missed a step.  If you originally installed 1.0.1 no need to instal this version.
Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

JayBachatero

Webrunner what values did you enter for each of the fields?
Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

littleone

So what do we need to do to fix it on our end?  I just tried to install it and it said no new updates were found for it?  Or am I moving a little to fast, lol

PrizeLive.com

Thanks Jay... mine works now!
Get Paid Instantly via PayPal (or other options) at PrizeLive.com!

JayBachatero

#32
littleone in Source/Subs-Members.php
Code (find) Select

// Recipents
$pm_register_recipients = array(
'to' => array($memberID),
'bbc' => array()
);

Code (replace) Select

// Recipents
$pm_register_recipients = array(
'to' => array($memberID),
'bcc' => array(),
);


EDIT: webrunner this should work for you also
Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

Webrunner

Send a PM to newly registered members?: on
ID of the member to send PM as: 5
Send PM to newly registered member as: webrunner
The subject of the PM: Welkom op VrouwenPower: het leukste en gezelligste vrouwenforum!

PM content:
Hallo {$username}, Welkom op {$boardname}.

Ik hoop dat je het hier naar je zin zult hebben. Lees wel eerst even de [url=http://www.vrouwenpower.nl/info/forum-reglement.php]forum regels[/url] door aljeblieft, dat voorkomt onduidelijkheden.


Mocht je nog vragen hebben kijk dan eerst even in het [url=http://www.vrouwenpower.nl/forum/index.php/board,95.0.html]forum met veelgestelde vragen[/url]. Staat het antwoord daar niet in dan kun je de vraag stellen in het [url=http://www.vrouwenpower.nl/forum/index.php/board,25.0.html]Help forum[/url] of een PB'tje (persoonlijk bericht, net zoals dit berichtje) sturen aan één van de modjes.

Veel plezier hier!
There is a difference between knowing the path and walking the path.

=========================================
Vrouwen Power! | Sprintweb: No nonsense e-Business consultancy

JayBachatero

Webrunner he changes that I supplied should fix the error. 

little one here you go.

<?php
/******************************************************************************
* Subs-members.php                                                            *
*******************************************************************************
* SMF: Simple Machines Forum                                                  *
* Open-Source Project Inspired by Zef Hemel ([email protected])                *
* =========================================================================== *
* Software Version:           SMF 1.1 RC2                                     *
* Software by:                Simple Machines (http://www.simplemachines.org) *
* Copyright 2001-2006 by:     Lewis Media (http://www.lewismedia.com)         *
* Support, News, Updates at:  http://www.simplemachines.org                   *
*******************************************************************************
* This program is free software; you may redistribute it and/or modify it     *
* under the terms of the provided license as published by Lewis Media.        *
*                                                                             *
* This program is distributed in the hope that it is and will be useful,      *
* but WITHOUT ANY WARRANTIES; without even any implied warranty of            *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                        *
*                                                                             *
* See the "license.txt" file for details of the Simple Machines license.      *
* The latest version can always be found at http://www.simplemachines.org.    *
******************************************************************************/
if (!defined('SMF'))
die('Hacking attempt...');

/* This file contains some useful functions for members and membergroups.

void deleteMembers(array $users)
- delete of one or more members.
- requires profile_remove_own or profile_remove_any permission for
  respectively removing your own account or any account.
- non-admins cannot delete admins.
- changes author of messages, topics and polls to guest authors.
- removes all log entries concerning the deleted members, except the
  error logs, ban logs and moderation logs.
- removes these members' personal messages (only the inbox), avatars,
  ban entries, theme settings, moderator positions, poll votes, and
  karma votes.
- updates member statistics afterwards.

bool deleteMembergroups(array groups)
- delete one of more membergroups.
- requires the manage_membergroups permission.
- returns true on success or false on failure.
- has protection against deletion of protected membergroups.
- deletes the permissions linked to the membergroup.
- takes members out of the deleted membergroups.

bool removeMembersFromGroups(array members, array groups = null)
- remove one or more members from one or more membergroups.
- requires the manage_membergroups permission.
- returns true on success or false on failure.
- if groups is null, the specified members are stripped from all their
  membergroups.
- function includes a protection against removing from implicit groups.
- non-admins are not able to remove members from the admin group.

bool addMembersToGroup(array members, group, type = 'auto')
- add one or more members to a specified group.
- requires the manage_membergroups permission.
- returns true on success or false on failure.
- the type parameter specifies whether the group is added as primary or
  as additional group.
- function has protection against adding members to implicit groups.
- non-admins are not able to add members to the admin group.

int registerMember(array options)
- registers a member to the forum.
- returns the ID of the newly created member.
- allows two types of interface: 'guest' and 'admin'. The first
  includes hammering protection, the latter can perform the
  registration silently.
- the strings used in the options array are assumed to be escaped.
- allows to perform several checks on the input, e.g. reserved names.
- adjusts member statistics.

bool isReservedName(string name, int ID_MEMBER = 0, bool is_name = true)
- checks if name is a reserved name or username.
- if is_name is false, the name is assumed to be a username.
- the ID_MEMBER variable is used to ignore duplicate matches with the
  current member.

array groupsAllowedTo(string permission, int board_id = null)
- retrieves a list of membergroups that are allowed to do the given 
  permission.
- if board_id is not null, a board permission is assumed.
- takes different permission settings into account.
- returns an array containing an array for the allowed membergroup ID's
  and an array for the denied membergroup ID's.

array membersAllowedTo(string permission, int board_id = null)
- retrieves a list of members that are allowed to do the given
  permission.
- if board_id is not null, a board permission is assumed.
- takes different permission settings into account.
- takes possible moderators (on board 'board_id') into account.
- returns an array containing member ID's.

int reattributePosts(int ID_MEMBER, string email = none, bool add_to_post_count = false)
- reattribute guest posts to a specified member.
- does not check for any permissions.
- returns the number of successful reattributed posts.
- if add_to_post_count is set, the member's post count is increased.

void BuddyListToggle()
- add a member to your buddy list or remove it.
- requires profile_identity_own permission.
- called by ?action=buddy;u=x;sesc=y.
- redirects to ?action=profile;u=x.
*/

// Delete a group of/single member.
function deleteMembers($users)
{
global $db_prefix$sourcedir$modSettings$ID_MEMBER;

// If it's not an array, make it so!
if (!is_array($users))
$users = array($users);
else
$users array_unique($users);

// Make sure there's no void user in here.
$users array_diff($users, array(0));

// How many are they deleting?
if (empty($users))
return;
elseif (count($users) == 1)
{
list ($user) = $users;
$condition '= ' $user;

if ($user == $ID_MEMBER)
isAllowedTo('profile_remove_own');
else
isAllowedTo('profile_remove_any');
}
else
{
foreach ($users as $k => $v)
$users[$k] = (int) $v;
$condition 'IN (' implode(', '$users) . ')';

// Deleting more than one?  You can't have more than one account...
isAllowedTo('profile_remove_any');
}

// Make sure they aren't trying to delete administrators if they aren't one.  But don't bother checking if it's just themself.
if (!allowedTo('admin_forum') && (count($users) != || $users[0] != $ID_MEMBER))
{
$request db_query("
SELECT ID_MEMBER
FROM 
{$db_prefix}members
WHERE ID_MEMBER IN (" 
implode(', '$users) . ")
AND (ID_GROUP = 1 OR FIND_IN_SET(1, additionalGroups) != 0)
LIMIT " 
count($users), __FILE____LINE__);
$admins = array();
while ($row mysql_fetch_assoc($request))
$admins[] = $row['ID_MEMBER'];
mysql_free_result($request);

if (!empty($admins))
$users array_diff($users$admins);
}

if (empty($users))
return;

// Log the action - regardless of who is deleting it.
foreach ($users as $user)
{
// Integration rocks!
if (isset($modSettings['integrate_delete_member']) && function_exists($modSettings['integrate_delete_member']))
call_user_func($modSettings['integrate_delete_member'], $user);

logAction('delete_member', array('member' => $user));
}

// Make these peoples' posts guest posts.
db_query("
UPDATE 
{$db_prefix}messages
SET ID_MEMBER = 0" 
. (!empty($modSettings['allow_hideEmail']) ? ", posterEmail = ''" '') . "
WHERE ID_MEMBER 
$condition"__FILE____LINE__);
db_query("
UPDATE 
{$db_prefix}polls
SET ID_MEMBER = 0
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

// Make these peoples' posts guest first posts and last posts.
db_query("
UPDATE 
{$db_prefix}topics
SET ID_MEMBER_STARTED = 0
WHERE ID_MEMBER_STARTED 
$condition"__FILE____LINE__);
db_query("
UPDATE 
{$db_prefix}topics
SET ID_MEMBER_UPDATED = 0
WHERE ID_MEMBER_UPDATED 
$condition"__FILE____LINE__);

db_query("
UPDATE 
{$db_prefix}log_actions
SET ID_MEMBER = 0
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

db_query("
UPDATE 
{$db_prefix}log_banned
SET ID_MEMBER = 0
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

db_query("
UPDATE 
{$db_prefix}log_errors
SET ID_MEMBER = 0
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

// Delete the member.
db_query("
DELETE FROM 
{$db_prefix}members
WHERE ID_MEMBER 
$condition
LIMIT " 
count($users), __FILE____LINE__);

// Delete the logs...
db_query("
DELETE FROM 
{$db_prefix}log_boards
WHERE ID_MEMBER 
$condition"__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}log_karma
WHERE ID_TARGET 
$condition
OR ID_EXECUTOR 
$condition"__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}log_mark_read
WHERE ID_MEMBER 
$condition"__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}log_notify
WHERE ID_MEMBER 
$condition"__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}log_online
WHERE ID_MEMBER 
$condition"__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}log_polls
WHERE ID_MEMBER 
$condition"__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}log_topics
WHERE ID_MEMBER 
$condition"__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}collapsed_categories
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

// Delete personal messages.
require_once($sourcedir '/PersonalMessage.php');
deleteMessages(nullnull$users);

db_query("
UPDATE 
{$db_prefix}personal_messages
SET ID_MEMBER_FROM = 0
WHERE ID_MEMBER_FROM 
$condition"__FILE____LINE__);

// Delete avatar.
require_once($sourcedir '/ManageAttachments.php');
removeAttachments('a.ID_MEMBER ' $condition);

// It's over, no more moderation for you.
db_query("
DELETE FROM 
{$db_prefix}moderators
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

// If you don't exist we can't ban you.
db_query("
DELETE FROM 
{$db_prefix}ban_items
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

// Remove individual theme settings.
db_query("
DELETE FROM 
{$db_prefix}themes
WHERE ID_MEMBER 
$condition"__FILE____LINE__);

// These users are nobody's buddy nomore.
$request db_query("
SELECT ID_MEMBER, pm_ignore_list, buddy_list
FROM 
{$db_prefix}members
WHERE FIND_IN_SET(" 
implode(', pm_ignore_list) OR FIND_IN_SET('$users) . ', pm_ignore_list) OR FIND_IN_SET(' implode(', buddy_list) OR FIND_IN_SET('$users) . ', buddy_list)'__FILE____LINE__);
while ($row mysql_fetch_assoc($request))
db_query("
UPDATE 
{$db_prefix}members
SET
pm_ignore_list = '" 
implode(','array_diff(explode(','$row['pm_ignore_list']), $users)) . "',
buddy_list = '" 
implode(','array_diff(explode(','$row['buddy_list']), $users)) . "'
WHERE ID_MEMBER = 
$row[ID_MEMBER]
LIMIT 1"
__FILE____LINE__);
mysql_free_result($request);

// Make sure no member's birthday is still sticking in the calendar...
updateStats('calendar');
updateStats('member');
}

// Delete one or more membergroups.
function deleteMembergroups($groups)
{
global $db_prefix;

// Just to be sure.
isAllowedTo('manage_membergroups');

// Make sure it's an array.
if (!is_array($groups))
$groups = array((int) $groups);
else
{
$groups array_unique($groups);

// Make sure all groups are integer.
foreach ($groups as $key => $value)
$groups[$key] = (int) $value;
}

// Some groups are protected (guests, administrators, moderators, newbies).
$groups array_diff($groups, array(-10134));
if (empty($groups))
return false;

// Remove the membergroups themselves.
db_query("
DELETE FROM 
{$db_prefix}membergroups
WHERE ID_GROUP IN (" 
implode(', '$groups) . ")
LIMIT " 
count($groups), __FILE____LINE__);

// Remove the permissions of the membergroups.
db_query("
DELETE FROM 
{$db_prefix}permissions
WHERE ID_GROUP IN (" 
implode(', '$groups) . ')'__FILE____LINE__);
db_query("
DELETE FROM 
{$db_prefix}board_permissions
WHERE ID_GROUP IN (" 
implode(', '$groups) . ')'__FILE____LINE__);

// Update the primary groups of members.
db_query("
UPDATE 
{$db_prefix}members
SET ID_GROUP = 0
WHERE ID_GROUP IN (" 
implode(', '$groups) . ')'__FILE____LINE__);

// Update the additional groups of members.
$request db_query("
SELECT ID_MEMBER, additionalGroups
FROM 
{$db_prefix}members
WHERE FIND_IN_SET(" 
implode(', additionalGroups) OR FIND_IN_SET('$groups) . ', additionalGroups)'__FILE____LINE__);
$updates = array();
while ($row mysql_fetch_assoc($request))
$updates[$row['additionalGroups']][] = $row['ID_MEMBER'];
mysql_free_result($request);

foreach ($updates as $additionalGroups => $memberArray)
updateMemberData($memberArray, array('additionalGroups' => '\'' implode(','array_diff(explode(','$additionalGroups), $groups)) . '\''));

// No boards can provide access to these membergroups anymore.
$request db_query("
SELECT ID_BOARD, memberGroups
FROM 
{$db_prefix}boards
WHERE FIND_IN_SET(" 
implode(', memberGroups) OR FIND_IN_SET('$groups) . ', memberGroups)'__FILE____LINE__);
$updates = array();
while ($row mysql_fetch_assoc($request))
$updates[$row['memberGroups']][] = $row['ID_BOARD'];
mysql_free_result($request);

foreach ($updates as $memberGroups => $boardArray)
db_query("
UPDATE 
{$db_prefix}boards
SET memberGroups = '" 
implode(','array_diff(explode(','$memberGroups), $groups)) . "'
WHERE ID_BOARD IN (" 
implode(', '$boardArray) . ")
LIMIT 1"
__FILE____LINE__);

// Recalculate the post groups, as they likely changed.
updateStats('postgroups');

// It was a success.
return true;
}

// Remove one or more members from one or more membergroups.
function removeMembersFromGroups($members$groups null)
{
global $db_prefix;

// You're getting nowhere without this permission.
isAllowedTo('manage_membergroups');

// Cleaning the input.
if (!is_array($members))
$members = array((int) $members);
else
{
$members array_unique($members);

// Cast the members to integer.
foreach ($members as $key => $value)
$members[$key] = (int) $value;
}

// Just incase.
if (empty($members))
return false;
elseif ($groups === null)
{
// Wanna remove all groups from these members? That's easy.
db_query("
UPDATE 
{$db_prefix}members
SET
ID_GROUP = 0,
additionalGroups = ''
WHERE ID_MEMBER IN (" 
implode(', '$members) . ")" . (allowedTo('admin_forum') ? '' "
AND ID_GROUP != 1
AND NOT FIND_IN_SET(1, additionalGroups)"
) . "
LIMIT " 
count($members), __FILE____LINE__);

updateStats('postgroups''ID_MEMBER IN (' implode(', '$members) . ')');

return true;
}
elseif (!is_array($groups))
$groups = array((int) $groups);
else
{
$groups array_unique($groups);

// Make sure all groups are integer.
foreach ($groups as $key => $value)
$groups[$key] = (int) $value;
}

// Fetch a list of groups members cannot be assigned to explicitely.
$implicitGroups = array(-103);
$request db_query("
SELECT ID_GROUP
FROM 
{$db_prefix}membergroups
WHERE minPosts != -1"
__FILE____LINE__);
while ($row mysql_fetch_assoc($request))
$implicitGroups[] = $row['ID_GROUP'];
mysql_free_result($request);

// Now get rid of those groups.
$groups array_diff($groups$implicitGroups);

// If you're not an admin yourself, you can't de-admin others.
if (!allowedTo('admin_forum'))
$groups array_diff($groups, array(1));

// Only continue if there are still groups and members left.
if (empty($groups) || empty($members))
return false;

// First, reset those who have this as their primary group - this is the easy one.
db_query("
UPDATE 
{$db_prefix}members
SET ID_GROUP = 0
WHERE ID_GROUP IN (" 
implode(', '$groups) . ")
AND ID_MEMBER IN (" 
implode(', '$members) . ")
LIMIT " 
count($members), __FILE____LINE__);

// Those who have it as part of their additional group must be updated the long way... sadly.
$request db_query("
SELECT ID_MEMBER, additionalGroups
FROM 
{$db_prefix}members
WHERE (FIND_IN_SET(" 
implode(', additionalGroups) OR FIND_IN_SET('$groups) . ", additionalGroups))
AND ID_MEMBER IN (" 
implode(', '$members) . ")
LIMIT " 
count($members), __FILE____LINE__);
$updates = array();
while ($row mysql_fetch_assoc($request))
$updates[$row['additionalGroups']][] = $row['ID_MEMBER'];
mysql_free_result($request);

foreach ($updates as $additionalGroups => $memberArray)
db_query("
UPDATE 
{$db_prefix}members
SET additionalGroups = '" 
implode(','array_diff(explode(','$additionalGroups), $groups)) . "'
WHERE ID_MEMBER IN (" 
implode(', '$memberArray) . ")
LIMIT " 
count($memberArray), __FILE____LINE__);

/* // !!! Another way to do this is:

SET additionalGroups = CASE
WHEN additionalGroups = '10' THEN ''
WHEN additionalGroups LIKE '10,%' THEN SUBSTRING(additionalGroups, LENGTH('10,'))
WHEN additionalGroups LIKE '%,10' THEN SUBSTRING(additionalGroups, 1, LENGTH(additionalGroups) - LENGTH(',10'))
WHEN additionalGroups LIKE '%,10,%' THEN REPLACE(additionalGroups, ',10,', ',')
ELSE additionalGroups
END

This is a lot longer and more verbose, but it might be faster.
That said, it would have to be run for each group individually... but we only usually do one at a time.
*/

// Their post groups may have changed now...
updateStats('postgroups''ID_MEMBER IN (' implode(', '$members) . ')');

// Mission successful.
return true;
}

// Add one or more members to a membergroup.
/* Supported types:
- only_primary      - Assigns a membergroup as primary membergroup, but only
                      if a member has not yet a primary membergroup assigned,
                      unless the member is already part of the membergroup.
- only_additional   - Assigns a membergroup to the additional membergroups,
                      unless the member is already part of the membergroup.
- force_primary     - Assigns a membergroup as primary membergroup no matter
                      what the previous primary membergroup was.
- auto              - Assigns a membergroup to the primary group if it's still
                      available. If not, assign it to the additional group. */
function addMembersToGroup($members$group$type 'auto')
{
global $db_prefix;

// Show your licence!
isAllowedTo('manage_membergroups');

if (!is_array($members))
$members = array((int) $members);
else
{
$members array_unique($members);

// Make sure all members are integer.
foreach ($members as $key => $value)
$members[$key] = (int) $value;
}
$group = (int) $group;

// Some groups just don't like explicitly having members.
$request db_query("
SELECT ID_GROUP
FROM 
{$db_prefix}membergroups
WHERE minPosts != -1"
__FILE____LINE__);
$implicitGroups = array(-103);
while ($row mysql_fetch_assoc($request))
$implicitGroups[] = $row['ID_GROUP'];
mysql_free_result($request);

// Sorry, you can't join an implicit group.
if (in_array($group$implicitGroups) || empty($members))
return false;

// Only admins can add admins.
if ($group == && !allowedTo('admin_forum'))
return false;

// Do the actual updates.
if ($type == 'only_additional')
db_query("
UPDATE 
{$db_prefix}members
SET additionalGroups = IF(additionalGroups = '', '
$group', CONCAT(additionalGroups, ',$group')))
WHERE ID_MEMBER IN (" 
implode(', '$members) . ")
AND ID_GROUP != 
$group
AND NOT FIND_IN_SET(
$group, additionalGroups)
LIMIT " 
count($members), __FILE____LINE__);
elseif ($type == 'only_primary' || $type == 'force_primary')
db_query("
UPDATE 
{$db_prefix}members
SET ID_GROUP = 
$group
WHERE ID_MEMBER IN (" 
implode(', '$members) . ")" . ($type == 'force_primary' '' "
AND ID_GROUP = 0
AND NOT FIND_IN_SET(
$group, additionalGroups)") . "
LIMIT " 
count($members), __FILE____LINE__);
elseif ($type == 'auto')
db_query("
UPDATE 
{$db_prefix}members
SET
additionalGroups = IF(ID_GROUP = 0, additionalGroups, IF(additionalGroups = '', '
$group', CONCAT(additionalGroups, ',$group'))),
ID_GROUP = IF(ID_GROUP = 0, 
$group, ID_GROUP)
WHERE ID_MEMBER IN (" 
implode(', '$members) . ")
AND ID_GROUP != 
$group
AND NOT FIND_IN_SET(
$group, additionalGroups)
LIMIT " 
count($members), __FILE____LINE__);
// Ack!!?  What happened?
else
trigger_error('addMembersToGroup(): Unknown type \'' $type '\''E_USER_WARNING);

// Update their postgroup statistics.
updateStats('postgroups''ID_MEMBER IN (' implode(', '$members) . ')');

return true;
}

function 
registerMember(&$regOptions)
{
global $scripturl$txt$modSettings$db_prefix$context$sourcedir;
global $user_info$options$settings$func;

loadLanguage('Login');

// We'll need some external functions.
require_once($sourcedir '/Subs-Auth.php');
require_once($sourcedir '/Subs-Post.php');

// Registration from the admin center, let them sweat a little more.
if ($regOptions['interface'] == 'admin')
{
is_not_guest();
isAllowedTo('moderate_forum');
}
// If you're an admin, you're special ;).
elseif ($regOptions['interface'] == 'guest')
{
spamProtection('register');

// You cannot register twice...
if (empty($user_info['is_guest']))
redirectexit();

// Make sure they didn't just register with this session.
if (!empty($_SESSION['just_registered']) && empty($modSettings['disableRegisterCheck']))
fatal_lang_error('register_only_once'false);
}

// No name?!  How can you register with no name?
if (empty($regOptions['username']))
fatal_lang_error(37false);

// Spaces and other odd characters are evil...
$regOptions['username'] = preg_replace('~[\t\n\r\x0B\0\xA0]+~' . ($context['utf8'] ? 'u' ''), ' '$regOptions['username']);

// Don't use too long a name.
if ($func['strlen']($regOptions['username']) > 25)
$regOptions['username'] = $func['htmltrim']($func['substr']($regOptions['username'], 025));

// Only these characters are permitted.
if (preg_match('~[<>&"\'=\\\]~'$regOptions['username']) != || $regOptions['username'] == '_' || $regOptions['username'] == '|' || strpos($regOptions['username'], '[code') !== false || strpos($regOptions['username'], '[/code') !== false)
fatal_lang_error(240false);

if (stristr($regOptions['username'], $txt[28]) !== false)
fatal_lang_error(244true, array($txt[28]));

// !!! Separate the sprintf?
if (empty($regOptions['email']) || preg_match('~^[0-9A-Za-z=_+\-/][0-9A-Za-z=_\'+\-/\.]*@[\w\-]+(\.[\w\-]+)*(\.[\w]{2,6})$~'stripslashes($regOptions['email'])) === || strlen(stripslashes($regOptions['email'])) > 255)
fatal_error(sprintf($txt[500], $regOptions['username']), false);

if (!empty($regOptions['check_reserved_name']) && isReservedName($regOptions['username'], 0false))
{
if ($regOptions['password'] == 'chocolate cake')
fatal_error('Sorry, I don\'t take bribes... you\'ll need to come up with a different name.'false);
fatal_error('(' htmlspecialchars($regOptions['username']) . ') ' $txt[473], false);
}

// Generate a validation code if it's supposed to be emailed.
$validation_code '';
if ($regOptions['require'] == 'activation')
$validation_code substr(preg_replace('/\W/'''md5(rand())), 010);

// If you haven't put in a password generated one.
if ($regOptions['interface'] == 'admin' && $regOptions['password'] == '')
{
srand(time() + 1277);
$regOptions['password'] = substr(preg_replace('/\W/'''md5(rand())), 010);
$regOptions['password_check'] = $regOptions['password'];
}
// Does the first password match the second?
elseif ($regOptions['password'] != $regOptions['password_check'])
fatal_lang_error(213false);

// That's kind of easy to guess...
if ($regOptions['password'] == '')
fatal_lang_error(91false);

// Now perform hard password validation as required.
if (!empty($regOptions['check_password_strength']))
{
$passwordError validatePassword($regOptions['password'], $regOptions['username'], array($regOptions['email']));

// Password isn't legal?
if ($passwordError != null)
fatal_lang_error('profile_error_password_' $passwordError);
}

// You may not be allowed to register this email.
if (!empty($regOptions['check_email_ban']))
isBannedEmail($regOptions['email'], 'cannot_register'$txt['ban_register_prohibited']);

// Check if the email address is in use.
$request db_query("
SELECT ID_MEMBER
FROM 
{$db_prefix}members
WHERE emailAddress = '
$regOptions[email]'
OR emailAddress = '
$regOptions[username]'
LIMIT 1"
__FILE____LINE__);
// !!! Separate the sprintf?
if (mysql_num_rows($request) != 0)
fatal_error(sprintf($txt[730], htmlspecialchars($regOptions['email'])), false);
mysql_free_result($request);

// Some of these might be overwritten. (the lower ones that are in the arrays below.)
$regOptions['register_vars'] = array(
'memberName' => "'$regOptions[username]'",
'emailAddress' => "'$regOptions[email]'",
'passwd' => '\'' sha1(strtolower($regOptions['username']) . $regOptions['password']) . '\'',
'passwordSalt' => '\'' substr(md5(rand()), 04) . '\'',
'posts' => 0,
'dateRegistered' => time(),
'memberIP' => "'$user_info[ip]'",
'validation_code' => "'$validation_code'",
'realName' => "'$regOptions[username]'",
'personalText' => '\'' addslashes($modSettings['default_personalText']) . '\'',
'pm_email_notify' => 1,
'ID_THEME' => 0,
'ID_POST_GROUP' => 4,
'lngfile' => "''",
'buddy_list' => "''",
'pm_ignore_list' => "''",
'messageLabels' => "''",
'personalText' => "''",
'websiteTitle' => "''",
'websiteUrl' => "''",
'location' => "''",
'ICQ' => "''",
'AIM' => "''",
'YIM' => "''",
'MSN' => "''",
'timeFormat' => "''",
'signature' => "''",
'avatar' => "''",
'usertitle' => "''",
'secretQuestion' => "''",
'secretAnswer' => "''",
'additionalGroups' => "''",
'smileySet' => "''",
);

// Setup the activation status on this new account so it is correct - firstly is it an under age account?
if ($regOptions['require'] == 'coppa')
{
$regOptions['register_vars']['is_activated'] = 5;
// !!! This should be changed.  To what should be it be changed??
$regOptions['register_vars']['validation_code'] = "''";
}
// Maybe it can be activated right away?
elseif ($regOptions['require'] == 'nothing')
$regOptions['register_vars']['is_activated'] = 1;
// Maybe it must be activated by email?
elseif ($regOptions['require'] == 'activation')
$regOptions['register_vars']['is_activated'] = 0;
// Otherwise it must be awaiting approval!
else
$regOptions['register_vars']['is_activated'] = 3;

if (isset($regOptions['memberGroup']))
{
// Make sure the ID_GROUP will be valid, if this is an administator.
$regOptions['register_vars']['ID_GROUP'] = $regOptions['memberGroup'] == && !allowedTo('admin_forum') ? $regOptions['memberGroup'];

// Check if this group is assignable.
$unassignableGroups = array(-13);
$request db_query("
SELECT ID_GROUP
FROM 
{$db_prefix}membergroups
WHERE minPosts != -1"
__FILE____LINE__);
while ($row mysql_fetch_assoc($request))
$unassignableGroups[] = $row['ID_GROUP'];
mysql_free_result($request);

if (in_array($regOptions['register_vars']['ID_GROUP'], $unassignableGroups))
$regOptions['register_vars']['ID_GROUP'] = 0;
}

// Integrate optional member settings to be set.
if (!empty($regOptions['extra_register_vars']))
foreach ($regOptions['extra_register_vars'] as $var => $value)
$regOptions['register_vars'][$var] = $value;

// Integrate optional user theme options to be set.
$theme_vars = array();
if (!empty($regOptions['theme_vars']))
foreach ($regOptions['theme_vars'] as $var => $value)
$theme_vars[$var] = $value;

// Call an optional function to validate the users' input.
if (isset($modSettings['integrate_register']) && function_exists($modSettings['integrate_register']))
$modSettings['integrate_register']($regOptions$theme_vars);

// Register them into the database.
db_query("
INSERT INTO 
{$db_prefix}members
(" 
implode(', 'array_keys($regOptions['register_vars'])) . ")
VALUES (" 
implode(', '$regOptions['register_vars']) . ')'__FILE____LINE__);
$memberID db_insert_id();

// Grab their real name and send emails using it.
$realName substr($regOptions['register_vars']['realName'], 1, -1);

// Update the number of members and latest member's info - and pass the name, but remove the 's.
updateStats('member'$memberID$realName);

// Theme variables too?
if (!empty($theme_vars))
{
$setString '';
foreach ($theme_vars as $var => $val)
$setString .= "
(
$memberID, SUBSTRING('$var', 1, 255), SUBSTRING('$val', 1, 65534)),";
db_query("
INSERT INTO 
{$db_prefix}themes
(ID_MEMBER, variable, value)
VALUES " 
substr($setString0, -1), __FILE____LINE__);
}

// If it's enabled, increase the registrations for today.
trackStats(array('registers' => '+'));

// Administrative registrations are a bit different...
if ($regOptions['interface'] == 'admin')
{
if ($regOptions['require'] == 'activation')
$email_message 'register_activate_message';
elseif (!empty($regOptions['send_welcome_email']))
$email_message 'register_immediate_message';

if (isset($email_message))
sendmail($regOptions['email'], $txt['register_subject'], sprintf($txt[$email_message], $realName$regOptions['username'], $regOptions['password'], $validation_code$scripturl '?action=activate;u=' $memberID ';code=' $validation_code));

// All admins are finished here.
return $memberID;
}

// Can post straight away - welcome them to your fantastic community...
if ($regOptions['require'] == 'nothing')
{
if (!empty($regOptions['send_welcome_email']))
sendmail($regOptions['email'], $txt['register_subject'], sprintf($txt['register_immediate_message'], $realName$regOptions['username'], $regOptions['password']));

// Send admin their notification.
adminNotify('standard'$memberID$regOptions['username']);
}
// Need to activate their account - or fall under COPPA.
elseif ($regOptions['require'] == 'activation' || $regOptions['require'] == 'coppa')
sendmail($regOptions['email'], $txt['register_subject'], sprintf($txt['register_activate_message'], $realName$regOptions['username'], $regOptions['password'], $validation_code$scripturl '?action=activate;u=' $memberID ';code=' $validation_code));
// Must be awaiting approval.
else
{
sendmail($regOptions['email'], $txt['register_subject'], sprintf($txt['register_pending_message'], $realName$regOptions['username'], $regOptions['password']));

// Admin gets informed here...
adminNotify('approval'$memberID$regOptions['username']);
}

// PM On Registration
if (isset($modSettings['pm_register_enable']) && $modSettings['pm_register_enable'] == 1)
{
// Set the array of keywords to replace.
$pmReplace = array(
'{$username}''{$boardname}'
);

// Set the $pm_register_body
$pm_register_body str_replace($pmReplace,
array(
$regOptions['username'],
'[url=' .$scripturl']' .$context['forum_name']. '[/url]',
),
$modSettings['pm_register_body']
);

// Clean up
$pm_register_body preg_replace('~<br(?: /)?' '>~'"\n"$pm_register_body);
$pm_register_body un_htmlspecialchars($pm_register_body);

// Set the user info.
$pm_register_from = array(
'id' => $modSettings['pm_register_id'],
'name' => $modSettings['pm_register_from'],
'username' => $modSettings['pm_register_from'],
);

// Recipents
$pm_register_recipients = array(
'to' => array($memberID),
'bcc' => array(),
);

// Send the PM
sendpm($pm_register_recipients$modSettings['pm_register_subject'], $pm_register_bodyfalse$pm_register_from);
}

// Okay, they're for sure registered... make sure the session is aware of this for security. (Just married :P!)
$_SESSION['just_registered'] = 1;

return $memberID;
}

// Check if a name is in the reserved words list. (name, current member id, name/username?.)
function isReservedName($name$current_ID_MEMBER 0$is_name true)
{
global $user_info$modSettings$db_prefix$func;

$checkName $func['strtolower']($name);

// Administrators are never restricted ;).
if (!allowedTo('moderate_forum') && ((!empty($modSettings['reserveName']) && $is_name) || !empty($modSettings['reserveUser']) && !$is_name))
{
$reservedNames explode("\n"$modSettings['reserveNames']);
// Case sensitive check?
$checkMe = empty($modSettings['reserveCase']) ? $checkName $name;

// Check each name in the list...
foreach ($reservedNames as $reserved)
{
if ($reserved == '')
continue;

// Case sensitive name?
$reservedCheck = empty($modSettings['reserveCase']) ? $func['strtolower']($reserved) : $reserved;
// If it's not just entire word, check for it in there somewhere...
if ($checkMe == $reservedCheck || ($func['strpos']($checkMe$reservedCheck) !== false && empty($modSettings['reserveWord'])))
fatal_lang_error(244true, array($reserved));
}

$censor_name $name;
if (censorText($censor_name) != $name)
fatal_lang_error('name_censored'true, array($name));
}

// Get rid of any SQL parts of the reserved name...
$checkName strtr($name, array('_' => '\\_''%' => '\\%'));

// Make sure they don't want someone else's name.
$request db_query("
SELECT ID_MEMBER
FROM 
{$db_prefix}members
WHERE " 
. (empty($current_ID_MEMBER) ? '' "ID_MEMBER != $current_ID_MEMBER
AND "
) . "(realName LIKE '$checkName' OR memberName LIKE '$checkName')
LIMIT 1"
__FILE____LINE__);
if (mysql_num_rows($request) > 0)
return true;
mysql_free_result($request);

// Does name case insensitive match a member group name?
$request db_query("
SELECT ID_GROUP
FROM 
{$db_prefix}membergroups
WHERE groupName LIKE '
$checkName'
LIMIT 1"
__FILE____LINE__);
if (mysql_num_rows($request) > 0)
return true;
mysql_free_result($request);

// Okay, they passed.
return false;
}

// Get a list of groups that have a given permission (on a given board).
function groupsAllowedTo($permission$board_id null)
{
global $db_prefix$modSettings$board_info;

// Admins are allowed to do anything.
$membergroups = array(
'allowed' => array(1),
'denied' => array(),
);

// Assume we're dealing with regular permissions (like profile_view_own).
if ($board_id === null)
{
$request db_query("
SELECT ID_GROUP, addDeny
FROM 
{$db_prefix}permissions
WHERE permission = '
$permission'"__FILE____LINE__);
while ($row mysql_fetch_assoc($request))
$membergroups[$row['addDeny'] === '1' 'allowed' 'denied'][] = $row['ID_GROUP'];
mysql_free_result($request);
}

// Let's do the global/local board permissions
else
{
// First get the permission mode of the given board.
if (isset($board_info['id']) && $board_info['id'] == $board_id)
$permission_mode $board_info['permission_mode'] == 'no_polls' : ($board_info['permission_mode'] == 'reply_only' : ($board_info['permission_mode'] == 'read_only' 0));
elseif ($board_id !== 0)
{
$request db_query("
SELECT permission_mode
FROM 
{$db_prefix}boards
WHERE ID_BOARD = 
$board_id
LIMIT 1"
__FILE____LINE__);
if (mysql_num_rows($request) == 0)
fatal_lang_error('smf232');
list($permission_mode) = mysql_fetch_row($request);
mysql_free_result($request);
}

// Without permissions-by-board, you might need moderator permission.
$moderator_only false;
if ($board_id !== && empty($modSettings['permission_enable_by_board']) && in_array($permission, array('post_reply_own''post_reply_any''post_new''poll_post')))
{
$max_allowable_mode 3;
if ($permission == 'post_new')
$max_allowable_mode 2;
elseif ($permission == 'poll_post')
$max_allowable_mode 0;

if ($permission_mode $max_allowable_mode)
$moderator_only true;
}

$request db_query("
SELECT bp.ID_GROUP, bp.addDeny
FROM (
{$db_prefix}board_permissions AS bp" . ($moderator_only ", {$db_prefix}board_permissions AS modperm" '') . ")
WHERE bp.permission = '
$permission'" . ($moderator_only "
AND modperm.ID_GROUP = bp.ID_GROUP 
AND modperm.ID_BOARD = 0 
AND modperm.permission = 'moderate_board' 
AND modperm.addDeny = 1" 
'') . "
AND bp.ID_BOARD " 
. (empty($modSettings['permission_enable_by_board']) || empty($permission_mode) || $board_id === '= 0' 'IN (0, ' $board_id ')'), __FILE____LINE__);
while ($row mysql_fetch_assoc($request))
$membergroups[$row['addDeny'] === '1' 'allowed' 'denied'][] = $row['ID_GROUP'];
mysql_free_result($request);
}

// Denied is never allowed.
$membergroups['allowed'] = array_diff($membergroups['allowed'], $membergroups['denied']);

return $membergroups;
}

// Get a list of members that have a given permission (on a given board).
function membersAllowedTo($permission$board_id null)
{
global $db_prefix;

$membergroups groupsAllowedTo($permission$board_id);

$include_moderators in_array(3$membergroups['allowed']) && $board_id !== null;
$membergroups['allowed'] = array_diff($membergroups['allowed'], array(3));

$exclude_moderators in_array(3$membergroups['denied']) && $board_id !== null;
$membergroups['denied'] = array_diff($membergroups['denied'], array(3));

$request db_query("
SELECT mem.ID_MEMBER
FROM 
{$db_prefix}members AS mem" . ($include_moderators || $exclude_moderators "
LEFT JOIN 
{$db_prefix}moderators AS mods ON (mods.ID_MEMBER = mem.ID_MEMBER AND ID_BOARD = $board_id)" '') . "
WHERE (" 
. ($include_moderators "mods.ID_MEMBER IS NOT NULL OR " '') . 'ID_GROUP IN (' implode(', '$membergroups['allowed']) . ") OR FIND_IN_SET(" implode(', mem.additionalGroups) OR FIND_IN_SET('$membergroups['allowed']) . ", mem.additionalGroups))" . (empty($membergroups['denied']) ? '' "
AND NOT (" 
. ($exclude_moderators "mods.ID_MEMBER IS NOT NULL OR " '') . 'ID_GROUP IN (' implode(', '$membergroups['denied']) . ") OR FIND_IN_SET(" implode(', mem.additionalGroups) OR FIND_IN_SET('$membergroups['denied']) . ", mem.additionalGroups))"), __FILE____LINE__);
$members = array();
while ($row mysql_fetch_assoc($request))
$members[] = $row['ID_MEMBER'];
mysql_free_result($request);

return $members;
}

// This function is used to reassociate members with relevant posts.
function reattributePosts($memID$email false$post_count false)
{
global $db_prefix;

// !!! This should be done by memberName not email, or by both.

// Firstly, if $email isn't passed find out the members email address.
if ($email === false)
{
$request db_query("
SELECT emailAddress
FROM 
{$db_prefix}members
WHERE ID_MEMBER = 
$memID
LIMIT 1"
__FILE____LINE__);
list ($email) = mysql_fetch_row($request);
mysql_free_result($request);
}

// If they want the post count restored then we need to do some research.
if ($post_count)
{
$request db_query("
SELECT COUNT(m.ID_MSG)
FROM (
{$db_prefix}messages AS m, {$db_prefix}boards AS b)
WHERE m.ID_MEMBER = 0
AND m.posterEmail = '
$email'
AND m.icon != 'recycled'
AND b.ID_BOARD = m.ID_BOARD
AND b.countPosts = 1"
__FILE____LINE__);
list ($messageCount) = mysql_fetch_row($request);
mysql_free_result($request);

updateMemberData($memID, array('posts' => 'posts + ' $messageCount));
}

// Finally, update the posts themselves!
db_query("
UPDATE 
{$db_prefix}messages
SET ID_MEMBER = 
$memID
WHERE posterEmail = '
$email'"__FILE____LINE__);

return db_affected_rows();
}

// This simple function adds/removes the passed user from the current users buddy list.
function BuddyListToggle()
{
global $user_info$ID_MEMBER;

checkSession('get');

isAllowedTo('profile_identity_own');
is_not_guest();

if (empty($_REQUEST['u']))
fatal_lang_error(1false);
$_REQUEST['u'] = (int) $_REQUEST['u'];

// Remove if it's already there...
if (in_array($_REQUEST['u'], $user_info['buddies']))
$user_info['buddies'] = array_diff($user_info['buddies'], array($_REQUEST['u']));
// ...or add if it's not.
else
$user_info['buddies'][] = (int) $_REQUEST['u'];

// Update the settings.
updateMemberData($ID_MEMBER, array('buddy_list' => "'" implode(','$user_info['buddies']) . "'"));

// Redirect back to the profile
redirectexit('action=profile;u=' $_REQUEST['u']);
}

?>

Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

littleone

ok all looks great.  Thanks for the fast fixes ;)

littleone

Its ok Jay, I figured it out.  I decided to read your code to figure out what I had deleted, lol.  I got it fixed, so you can delete the code from your post so it dont take up half the page, lol.  Appreciate it though!

JayBachatero

Ok glad to hear everything is working now.  Sorry for the mess of bugs this mod had :(.  This type of  mod is hard to test since SMF has a hardcoded limit of the amount of times that you can register in a given period of time so that made testing even harder.
Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

Webrunner

Quote from: Jay The Code Monkey on July 17, 2006, 09:06:29 PM
Ok glad to hear everything is working now.  Sorry for the mess of bugs this mod had :(.  This type of  mod is hard to test since SMF has a hardcoded limit of the amount of times that you can register in a given period of time so that made testing even harder.

No worries, that is why we are here :)

About your code suggestion: could you tell me what you changed? I have other mods installed and don't want them to break down.
There is a difference between knowing the path and walking the path.

=========================================
Vrouwen Power! | Sprintweb: No nonsense e-Business consultancy

JayBachatero

Follow me on Twitter

"HELP!!! I've fallen and I can't get up"
This moment has been brought to you by LifeAlert

Advertisement: