public function Check($Type = '', $Name = '') { if ($Type != '' && $Name != '') { $this->AddItem($Type, $Name); } if (count($this->_Items) > 0) { // TODO: Use garden update check url instead of this: $UpdateUrl = Url('/lussumo/update', TRUE, TRUE); $Host = Gdn_Url::Host(); $Path = CombinePaths(array(Gdn_Url::WebRoot(), 'lussumo', 'update'), '/'); $Port = 80; /* $UpdateUrl = Gdn::Config('Garden.UpdateCheckUrl', ''); $UpdateUrl = parse_url($UpdateUrl); $Host = ArrayValue('host', $UpdateUrl, 'www.lussumo.com'); $Path = ArrayValue('path', $UpdateUrl, '/'); $Port = ArrayValue('port', $UpdateUrl, '80'); */ $Path .= '?Check=' . urlencode(Format::Serialize($this->_Items)); $Locale = Gdn::Config('Garden.Locale', 'Undefined'); $Referer = Gdn_Url::WebRoot(TRUE); if ($Referer === FALSE) { $Referer = 'Undefined'; } $Timeout = 10; $Response = ''; // Connect to the update server. $Pointer = @fsockopen($Host, '80', $ErrorNumber, $Error, $Timeout); if (!$Pointer) { throw new Exception(sprintf(Gdn::Translate('Encountered an error when attempting to connect to the update server (%1$s): [%2$s] %3$s'), $UpdateUrl, $ErrorNumber, $Error)); } else { // send the necessary headers to get the file fputs($Pointer, "GET {$Path} HTTP/1.0\r\n" . "Host: {$Host}\r\n" . "User-Agent: Lussumo Garden/1.0\r\n" . "Accept: */*\r\n" . "Accept-Language: " . $Locale . "\r\n" . "Accept-Charset: utf-8;\r\n" . "Keep-Alive: 300\r\n" . "Connection: keep-alive\r\n" . "Referer: {$Referer}\r\n\r\n"); // Retrieve the response from the remote server while ($Line = fread($Pointer, 4096)) { $Response .= $Line; } fclose($Pointer); // Remove response headers $Response = substr($Response, strpos($Response, "\r\n\r\n") + 4); } $Result = Format::Unserialize($Response); // print_r($Result); if (is_array($Result)) { $this->_Items = $Result; } else { $Result = FALSE; } return $Result; } }
public function AddUserToConversation($ConversationID, $UserID) { if (!is_array($UserID)) { $UserID = array($UserID); } // First define the current users in the conversation $OldContributorData = $this->GetRecipients($ConversationID); $OldContributorUserIDs = ConsolidateArrayValuesByKey($OldContributorData->ResultArray(), 'UserID'); $AddedUserIDs = array(); // Get some information about this conversation $ConversationData = $this->SQL->Select('MessageID', 'max', 'LastMessageID')->Select('MessageID', 'count', 'CountMessages')->From('ConversationMessage')->Where('ConversationID', $ConversationID)->Get()->FirstRow(); // Add the user(s) if they are not already in the conversation foreach ($UserID as $NewUserID) { if (!in_array($NewUserID, $OldContributorUserIDs)) { $AddedUserIDs[] = $NewUserID; $this->SQL->Insert('UserConversation', array('UserID' => $NewUserID, 'ConversationID' => $ConversationID, 'LastMessageID' => $ConversationData->LastMessageID, 'CountMessages' => $ConversationData->CountMessages, 'CountNewMessages' => $ConversationData->CountMessages)); } } if (count($AddedUserIDs) > 0) { $Session = Gdn::Session(); // Update the Contributors field on the conversation $Contributors = array_unique(array_merge($AddedUserIDs, $OldContributorUserIDs)); sort($Contributors); $this->SQL->Update('Conversation')->Set('Contributors', Format::Serialize($Contributors))->Where('ConversationID', $ConversationID)->Put(); // NOTIFY ALL NEWLY ADDED USERS THAT THEY WERE ADDED TO THE CONVERSATION foreach ($AddedUserIDs as $AddedUserID) { AddActivity($Session->UserID, 'AddedToConversation', '', $AddedUserID, '/messages/' . $ConversationID); } // Update the unread conversation count for each affected user $this->SQL->Update('User')->Set('CountUnreadConversations', 'CountUnreadConversations + 1', FALSE)->WhereIn('UserID', $AddedUserIDs)->Put(); } }
/** * Saves a name/value to the user's specified $Column. * * This method throws exceptions when errors are encountered. Use try ... * catch blocks to capture these exceptions. * * @param string The name of the serialized column to save to. At the time of this writing there are three serialized columns on the user table: Permissions, Preferences, and Attributes. * @param int The UserID to save. * @param mixed The name of the value being saved, or an associative array of name => value pairs to be saved. If this is an associative array, the $Value argument will be ignored. * @param mixed The value being saved. */ public function SaveToSerializedColumn($Column, $UserID, $Name, $Value = '') { // Load the existing values $UserData = $this->SQL->Select($Column)->From('User')->Where('UserID', $UserID)->Get()->FirstRow(); if (!$UserData) { throw new Exception(Gdn::Translate('ErrorRecordNotFound')); } $Values = Format::Unserialize($UserData->{$Column}); // Throw an exception if the field was not empty but is also not an object or array if (is_string($Values) && $Values != '') { throw new Exception(Gdn::Translate('Serialized column failed to be unserialized.')); } if (!is_array($Values)) { $Values = array(); } // Assign the new value(s) if (!is_array($Name)) { $Name = array($Name => $Value); } $Values = Format::Serialize(array_merge($Values, $Name)); // Save the values back to the db return $this->SQL->Put('User', array($Column => $Values), array('UserID' => $UserID)); }
public function Index() { $this->AddJsFile('settings.js'); $this->Title(Translate('Dashboard')); $this->RequiredAdminPermissions[] = 'Garden.Settings.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Routes.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Applications.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Plugins.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Themes.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Registration.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Applicants.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Roles.Manage'; $this->RequiredAdminPermissions[] = 'Garden.Users.Add'; $this->RequiredAdminPermissions[] = 'Garden.Users.Edit'; $this->RequiredAdminPermissions[] = 'Garden.Users.Delete'; $this->RequiredAdminPermissions[] = 'Garden.Users.Approve'; $this->FireEvent('DefineAdminPermissions'); $this->Permission($this->RequiredAdminPermissions, '', FALSE); $this->AddSideMenu('garden/settings'); $UserModel = Gdn::UserModel(); // Load some data to display on the dashboard $this->BuzzData = array(); // Get the number of users in the database $CountUsers = $UserModel->GetCountLike(); $this->AddDefinition('CountUsers', $CountUsers); $this->BuzzData[Translate('Users')] = number_format($CountUsers); // Get the number of new users in the last day $this->BuzzData[Translate('New users in the last day')] = number_format($UserModel->GetCountWhere(array('DateInserted >=' => Format::ToDateTime(strtotime('-1 day'))))); // Get the number of new users in the last week $this->BuzzData[Translate('New users in the last week')] = number_format($UserModel->GetCountWhere(array('DateInserted >=' => Format::ToDateTime(strtotime('-1 week'))))); // Get recently active users $this->ActiveUserData = $UserModel->GetActiveUsers(5); // Check to see if the application needs to phone-home for updates. Doing // this here because this method is always called when admin pages are // loaded regardless of the application loading them. $UpdateCheckDate = Gdn::Config('Garden.UpdateCheckDate', ''); if ($UpdateCheckDate == '' || !IsTimestamp($UpdateCheckDate) || $UpdateCheckDate < strtotime("-1 day")) { $UpdateData = array(); // Grab all of the plugins & versions $PluginManager = Gdn::Factory('PluginManager'); $Plugins = $PluginManager->AvailablePlugins(); foreach ($Plugins as $Plugin => $Info) { $Name = ArrayValue('Name', $Info, $Plugin); $Version = ArrayValue('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Plugin'); } } // Grab all of the applications & versions $ApplicationManager = Gdn::Factory('ApplicationManager'); $Applications = $ApplicationManager->AvailableApplications(); foreach ($Applications as $Application => $Info) { $Name = ArrayValue('Name', $Info, $Application); $Version = ArrayValue('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Application'); } } // Grab all of the themes & versions $ThemeManager = new Gdn_ThemeManager(); $Themes = $ThemeManager->AvailableThemes(); foreach ($Themes as $Theme => $Info) { $Name = ArrayValue('Name', $Info, $Theme); $Version = ArrayValue('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Theme'); } } // Dump the entire set of information into the definition list (jQuery // will pick it up and ping the VanillaForums.org server with this info). $this->AddDefinition('UpdateChecks', Format::Serialize($UpdateData)); } // Fire an event so other applications can add some data to be displayed $this->FireEvent('DashboardData'); $this->Render(); }
/** * Assigns a setting to the configuration array. * * @param string $Name The name of the configuration setting to assign. If the setting is * contained within an associative array, use dot denomination to get the * setting. ie. <code>$this->Set('Database.Host', $Value)</code> would set * <code>$Configuration[$Group]['Database']['Host'] = $Value</code>. * @param mixed $Value The value of the configuration setting. * @param boolean $Overwrite If the setting already exists, should it's value be overwritten? Defaults to true. */ public function Set($Name, $Value, $Overwrite = TRUE) { if (!is_array($this->_Data)) { $this->_Data = array(); } if (!is_array($this->_SaveData)) { $this->_SaveData = array(); } $Keys = explode('.', $Name); $KeyCount = count($Keys); $Array =& $this->_Data; $SaveArray =& $this->_SaveData; for ($i = 0; $i < $KeyCount; ++$i) { $Key = $Keys[$i]; $KeyExists = array_key_exists($Key, $Array); if ($i == $KeyCount - 1) { // If we are on the last iteration of the key, then set the value. if ($KeyExists === FALSE || $Overwrite === TRUE) { $Array[$Key] = Format::Serialize($Value); $SaveArray[$Key] = Format::Serialize($Value); } } else { // Otherwise, traverse the array if ($KeyExists === FALSE) { $Array[$Key] = array(); $SaveArray[$Key] = array(); } $Array =& $Array[$Key]; $SaveArray =& $SaveArray[$Key]; } } }
/** * Adds information to the definition list that causes the app to "phone * home" and see if there are upgrades available. Currently added to the * dashboard only. * Nothing renders with this method. It is public so it can be added by * plugins. */ public function AddUpdateCheck() { // Check to see if the application needs to phone-home for updates. Doing // this here because this method is always called when admin pages are // loaded regardless of the application loading them. $UpdateCheckDate = Gdn::Config('Garden.UpdateCheckDate', ''); if ($UpdateCheckDate == '' || !IsTimestamp($UpdateCheckDate) || $UpdateCheckDate < strtotime("-1 day")) { $UpdateData = array(); // Grab all of the plugins & versions $PluginManager = Gdn::Factory('PluginManager'); $Plugins = $PluginManager->AvailablePlugins(); foreach ($Plugins as $Plugin => $Info) { $Name = ArrayValue('Name', $Info, $Plugin); $Version = ArrayValue('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Plugin'); } } // Grab all of the applications & versions $ApplicationManager = Gdn::Factory('ApplicationManager'); $Applications = $ApplicationManager->AvailableApplications(); foreach ($Applications as $Application => $Info) { $Name = ArrayValue('Name', $Info, $Application); $Version = ArrayValue('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Application'); } } // Grab all of the themes & versions $ThemeManager = new Gdn_ThemeManager(); $Themes = $ThemeManager->AvailableThemes(); foreach ($Themes as $Theme => $Info) { $Name = ArrayValue('Name', $Info, $Theme); $Version = ArrayValue('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Theme'); } } // Dump the entire set of information into the definition list (jQuery // will pick it up and ping the VanillaForums.org server with this info). $this->AddDefinition('UpdateChecks', Format::Serialize($UpdateData)); } }
public function SaveToSerializedColumn($Column, $RowID, $Name, $Value = '') { if (!isset($this->Schema)) { $this->DefineSchema(); } // TODO: need to be sure that $this->PrimaryKey is only one primary key $FieldName = $this->PrimaryKey; // Load the existing values $Row = $this->SQL->Select($Column)->From($this->Name)->Where($FieldName, $RowID)->Get()->FirstRow(); if (!$Row) { throw new Exception(Gdn::Translate('ErrorRecordNotFound')); } $Values = Format::Unserialize($Row->{$Column}); if (is_string($Values) && $Values != '') { throw new Exception(Gdn::Translate('Serialized column failed to be unserialized.')); } if (!is_array($Values)) { $Values = array(); } if (!is_array($Name)) { $Name = array($Name => $Value); } // Assign the new value(s) $Values = Format::Serialize(array_merge($Values, $Name)); // Save the values back to the db return $this->SQL->From($this->Name)->Where($FieldName, $RowID)->Set($Column, $Values)->Put(); }