Version 4.7.0

This commit is contained in:
Neo committed 2025-12-19 16:00:35 -08:00
1 parent 517a5e1f70
commit 8ba7d43898
1933 files changed
+65613 -11332

No files matched your search

@@ -161,7 +161,7 @@ class _Rule extends \IPS\Node\Model
$extraElements[] = $filterElement;
}
$awardTo = $achievementAction->awardOptions();
$awardTo = $achievementAction->awardOptions( $this->filters );
$awardSubjectField = new \IPS\Helpers\Form\Custom( "{$exploded[1]}_{$exploded[5]}_award_subject", [ 'points' => $this->points_subject, 'badge' => $this->badge_subject ], FALSE, [
'getHtml' => function( $field ) {
return \IPS\Theme::i()->getTemplate('achievements')->awardField( $field->name, $field->value );
@@ -228,7 +228,7 @@ class _Rule extends \IPS\Node\Model
{
if ( isset( $values[$values['achievement_rule_action'] . '_award_' . $type . '_badge'] ) )
{
if ( $values[$values['achievement_rule_action'] . '_award_subject']['badge'] )
if ( $values[$values['achievement_rule_action'] . '_award_' . $type]['badge'] )
{
\IPS\Lang::saveCustom( 'core', "core_award_" . $type . "_badge_{$this->id}", $values[$values['achievement_rule_action'] . '_award_' . $type . '_badge'] );
}
@@ -244,7 +244,7 @@ class _Rule extends \IPS\Node\Model
$return = [
'action' => $values['achievement_rule_action'],
'filters' => $filters ? json_encode( $filters ) : NULL,
'milestone' => isset( $filters['milestone'] ) ? $filters['milestone'] : NULL,
'milestone' => ( isset( $filters['milestone'] ) and \is_numeric( $filters['milestone'] ) ) ? $filters['milestone'] : NULL,
'points_subject'=> \intval( $values[ $values['achievement_rule_action'] . '_award_subject' ]['points'] ),
'badge_subject' => $values[ $values['achievement_rule_action'] . '_award_subject' ]['badge'] ? \intval( $values[ $values['achievement_rule_action'] . '_award_subject' ]['badge'] ): NULL,
'points_other' => \intval( isset( $values[ $values['achievement_rule_action'] . '_award_other' ] ) ? $values[ $values['achievement_rule_action'] . '_award_other' ]['points'] : 0 ),
@@ -322,10 +322,33 @@ class _Rule extends \IPS\Node\Model
{
parent::delete();
\IPS\Db::i()->delete( 'core_achievements_log_milestones', array( 'milestone_rule=?', $this->id ) );
\IPS\Lang::deleteCustom( 'core', "core_award_subject_badge_{$this->id}" );
\IPS\Lang::deleteCustom( 'core', "core_award_other_badge_{$this->id}" );
}
/**
* [Node] Clone the rule
*
* @return void
*/
public function __clone()
{
if ( $this->skipCloneDuplication === TRUE ) {
return;
}
$oldId = $this->id;
parent::__clone();
foreach ( array( 'subject' => "core_award_subject_badge_{$this->id}", 'other' => "core_award_other_badge_{$this->id}") as $fieldKey => $langKey ) {
$oldLangKey = str_replace( $this->id, $oldId, $langKey );
\IPS\Lang::saveCustom( 'core', $langKey, iterator_to_array(\IPS\Db::i()->select( 'word_custom, lang_id', 'core_sys_lang_words', array('word_key=?', $oldLangKey ) )->setKeyField('lang_id')->setValueField('word_custom' ) ) );
}
}
/**
* Get details about the rebuild progress so far
*
@@ -360,6 +383,7 @@ class _Rule extends \IPS\Node\Model
public static function rebuildAllAchievements( ?\IPS\DateTime $time )
{
\IPS\Db::i()->delete( 'core_achievements_log' );
\IPS\Db::i()->delete( 'core_achievements_log_milestones' );
\IPS\Db::i()->delete( 'core_points_log' );
\IPS\Db::i()->delete( 'core_member_badges', [ 'rule > 0' ] ); /* 0 is a manually awarded badge. Don't hate the coder, hate the player */
\IPS\Db::i()->update( 'core_members', [ 'achievements_points' => 0 ] );
@@ -410,7 +434,12 @@ class _Rule extends \IPS\Node\Model
{
foreach( $rules as $ruleId => $rule )
{
static::load( $ruleId )->delete();
try
{
static::load( $ruleId )->delete();
}
catch( \OutOfRangeException $e ){}
}
}
}
@@ -450,6 +479,12 @@ class _Rule extends \IPS\Node\Model
continue;
}
/* Skip the forum related rule if we don't have forums installed */
if ( $xml->name == 'action' AND !static::canImport( $xml->readString() ) )
{
continue 2;
}
switch ( $xml->name )
{
case 'action':
@@ -566,4 +601,49 @@ class _Rule extends \IPS\Node\Model
unset( \IPS\Data\Store::i()->achievementRules );
}
/**
* Only import the node if the application is installed
*
* @param string $value Actionname
* @return bool
*/
public static function canImport( string $value ) : bool
{
$appKey = explode( '_', $value );
return \IPS\Application::appIsEnabled( $appKey[0] );
}
/**
* Does this rule have a milestone set?
*
* @param array|null $filters Actionname
* @return bool
*/
public static function ruleHasMilestone( ?array $filters ): bool
{
if ( \is_array( $filters ) and \count( $filters ) )
{
foreach( $filters as $key => $value )
{
if ( mb_substr( $key, 0, 9 ) == 'milestone' )
{
return TRUE;
}
}
}
return FALSE;
}
/**
* [Node] Get the title to store in the log
*
* @return string|null
*/
public function titleForLog()
{
$exploded = explode( '_', $this->action );
return \IPS\Lang::load( \IPS\Lang::defaultLanguage() )->get( 'AchievementAction__' . $exploded[1] . '_title' ) . " #" . $this->id;
}
}