Popular Content

Showing content with the highest reputation since 04/12/2015 in all areas

  1. 3 points
    Here is the game plan. There are a series of additional apps that I have in mind that will build on the base application, each providing a new layer to the overall economy. Those would be: * Assets * Investments * Marketplace * Lotteries Each will build on each other. Stock-market would fall under the domain of investments. The concept being that an asset can be created whose value is then tied to fluctuating variables. Once assets have been engineered, then investments can begin.
  2. 3 points
    In this tutorial, we'll be creating a system that will move "inactive" members to a different member group if they haven't participated in the community for a given period of time. Ingredients: 1 Custom Action 1 Rule Step 1: Create a custom action in rules. Call it "Deactivate inactive member". After creating this custom action, add an action argument to it that will accept a member. Argument Name: "Member", Description: "Member to deactivate", Argument Type: "Object", Value Type: "Any Member ( \IPS\Member )", Required: Yes Step 2: Create a new rule. Use the "Deactivate inactive member" custom action as the rule trigger event. Call it "Deactivate members if they have been inactive". Once you have created the rule, you will need to add a condition to the rule which checks if the member actually meets the criteria for being "inactive". One way to do this would be to add a condition which checks "Member attribute values". Call it "Member last activity within the time period". Select "Last Activity" as the attribute to check, then choose the "within the last" option, and set the time period to an appropriate value such as 3 months. The "Member To Check" should be set to the argument from the custom action "Member to deactivate". Since this condition will check if the member HAS been active within the time period, make sure to check the "NOT" option for the condition so it is only true when they have not been active. Save the condition. You may wish to add other conditions as you see fit. Add an action to this rule which will be taken when the rule conditions are met. Select the "Change the primary group of a member" action. Call it "Move member to new group". Select a new group to move the member to and for the "Member To Change Primary Group For", choose the "Member to deactivate" event argument. Step 3: Schedule the custom action on a recurring basis. Go to "Custom Actions" in your rules ACP. Click the dropdown menu for "Deactivate inactive member" and choose "Schedule Manually". Choose "Recurring" for the action frequency. Choose an appropriate time period between scheduled runs, such as 7 days. Since you will want this action to be applied to all members in the community, choose "Member" as the bulk process option. Save the form. That's it! Enjoy this recipe. deactivate-members-who-have-been-inactive.xml
  3. 2 points
    It is fairly common to have an action or set of actions that you would like to perform on a piece of content (or member) only after a certain amount of time has elapsed between particular events. For example, you might want to: Close a topic automatically a certain amount of time after it was created. Move a topic to a different forum if it hasn't been posted in for a certain amount of time. Send members a polite follow up email if they haven't logged in for a specified period of time. There is a simple pattern that you can use in all of these cases, which isn't so obvious to those that are new to rules, but is very easy to implement once you understand how it works. Why does this work? It's in the keyphrase. Let's take a look at example #2 above. We want to move the topic if it hasn't been posted in for 3 weeks. So what we do is to create an action to move the topic to the new location, and schedule that action for 3 weeks in the future instead of executing it immediately. This way each time a post is made in the topic, the move gets rescheduled. It's important to use a keyphrase that will be unique to that topic, so we must include a token in the keyphrase such as the topic id. It could look something like this: "Move topic [content:id] to graveyard". Of course, the token that corresponds to the id of what you are trying to move will depend on the event that you are writing your rule for, so make sure to look at the tokens list to see which token corresponds to your content id. But the concept is pretty simple. With every post, we assume that it is going to be the last post that happens... and we schedule the future action for the set amount of time in the future. If another person posts in the topic, we simply schedule the future action again which removes any previously scheduled follow up action with the same keyphrase, and sets in motion the new follow up action. This way the only follow up action that is in motion for the topic is the one which was scheduled after the last time the chosen event occured (in this case, it's when a topic comment is posted). If no qualified event happens within the timeframe between the last action and the follow up action which causes the follow up to be rescheduled, then the follow up action executes and the cycle ends.
  4. 2 points
    Yes. That has been sorely needed.
  5. 2 points
    Using version 1.0.5 or higher: {{if \IPS\Member::loggedIn()->hasBalance( $currency_id, $bank_id )}} {expression="\IPS\Member::loggedIn()->balance( $currency_id, $bank_id )->display( 'amount' )"} {{endif}}
  6. 2 points
    Hi ! It would be great if Points Economy could show a leaderboard of users based on balance or points history. It could be a widget such as "My Balance". Thanks
  7. 2 points
    The following api method can be used to obtain the net worth value of a member for a particular currency. Get A Member's Net Worth class \IPS\points\Currency /** * Get net worth as of a certain date/time * * @param \IPS\DateTime $date The date/time to retrieve the balance for * @param \IPS\Member $member The member to retrieve the balance for * @return int|float */ public function netWorthAsOf( \IPS\DateTime $date=NULL, \IPS\Member $member=NULL ); Example: /* Load a currency */ $currency = \IPS\points\Currency::load( 1 ); /* Load a member */ $member = \IPS\Member::load( 1 ); /* Get the current net worth of the member for the currency */ $worth = $currency->netWorthAsOf( new \IPS\DateTime( 'now' ), $member );
  8. 2 points
    Awesome, thanks Kevin (and Michael for helping)
  9. 2 points
    So like a customizable application form to go with the join request? Or like a test.
  10. 2 points
    Yeah like a red or yellow warning icon that there's unapproved content, new members, changes to the collab, etc.
  11. 2 points
    So I just had my very first member join a collab on my board. Very exciting! (Actually I told her to join ... ). When I was activating her membership though, I almost completely missed over the inline notification. My suggestion is to show a warning / announcement on the homepage of the collab to the collab's leaders of unapproved members / unapproved content / flagged content, etc. This will be a much more visual reminder that there's stuff to be taken care of.
  12. 2 points
    +1 for this - it would make collab leaders clear it up to get rid of the message - nice red banner to really annoy them
  13. 2 points
    This started out as a single suggestion but I wanted to widen the perspective to the broader topic of content discovery in GC. I personally find it's difficult to discover and immediately attain new content, and wanted to provide feedback at each level of the app for your consideration and thought. Overall Navigation For me, I first navigate to my list of collabs from my Menu. I then enter the collab, then click on a forum board, then click on the topic. That's at least 4 clicks to get to any real content. That's a lot of clicks for me even as an admin, and I'm kind of beholden to navigating everywhere if I need to accomplish something! That many clicks for a member dramatically lessens their chance of wanting to continue further unless they specifically want the end-result. Collab List I've been trained by IPS to search for the big blue dot, which takes me to new content. On the Collab List, I've caught myself many times almost clicking on the big blue category icon which "Marks collab as read!" Suggestions: Add a small iconography of # new unread items Add a small blue dot next to each content type subcategory. Here's a photo: (By the way, I absolutely LOVE the small iconography of "Number of Members" and "You are a member." I wish IPS would embrace more of these small icons in their design, which elegantly imparts so much information in such little space.) Collab Home I don't necessarily have a problem with the Home on its own merits since it does what it was designed to do (list all of the categories and apps), but I do wish there was the ability to incorporate recent activity directly onto the Home page. Suggestions: Activity stream beneath the collab banner and above categories Masonry style layout for recent images for gallery app (like the Gallery homepage) Widgets for Recent Files, Recent Forum Posts, etc. I don't expect you to implement all or even any of these, but I hope this might give you some further food for thought on how to better push recent activity to a higher level like the collab homepage or even on the collab listing. Hope this helps.
  14. 2 points
    I forgot to make this suggestionw hen I was setting up my Groups collab over the weekend. When you go through the wizard (which was very easy by the way, love the interface), I wish you had added a toggle ALL button to the moderation abilities for owners. Otherwise I had to individually click on every moderation option. See below for my amazing hand-drawn rendering
  15. 2 points
    Playing off these thoughts a little bit using Calendar as an example. I would like to be able to throw the calendars of a collab category under a master category on the main site calendar. Meaning, I would like an option under calendars in the collab category, to select a parent category/categories that all of the collabs in this category could appear under. Then under each collab, the collab owner would have the option of including their calendar entries in one of those master calendar category listings or not. A similar thought could be extrapolated to other areas as well. Gallery already does this in a way. When you post images under a collab, they also appear under "New Images" in the gallery on the main site. But it would be great if I could make Gallery categories for all of my collab categories, and then any images that were posted under that collab would be included in that Gallery category (with the option for collab owners to opt out of that).
  16. 2 points
    I know you can assign a users Points in the ACP, but what about giving the option for the admin to allow Moderators to adjust a users Points in the Moderator Control Panel?
  17. 2 points
    Hello, I was wondering where the points are stored for each person/currency in the database. We need to tie in some custom work with this app. Thank you in advance! Your applications are phenomenal, as always! Respectfully, cdavbar *Edit* Didn't notice I had two pages of tables, found it
  18. 2 points
    Personally, I would have made it so that every different type of notification that you can send through rules would optionally have its own configuration on that page. But IPS4 core builds that page on its own with the options based on the notification extension used to send the notification. Rules obviously uses its own extension to send notifications, but people need to have the ability to change or modify how they receive those notifications. I have a list of updates that I plan to make to rules though, and this is a good candidate to go on that list.
  19. 2 points
    Gabriel Torres, I would like to help, since Kevin seems to be offline. Condition to check: Truth Value, Comparison Type: Value is FALSE Value to Compare: Boolean value indicating if content is new This will check, if someone is updating (changing) a topic comment (post). (You should select Event: "Topic Comment has been created or updated" as mentioned above.)
  20. 2 points
    This is already well addressed with the core app. Of course, it has a compliment of rules ECA's already built in. But it also includes commerce integration to both add points to products that can be purchased, and to also use points as a payment method to be able to purchase products. Points can be exchanged with each other as well since you can set up any number of currencies and call them what you like (each with their own exchange rate), just like real currency. Of course, you can set the permissions as you wish as to what can be exchanged in/out, etc. Then of course they can be sent between members and transfered into banks that the site administrator sets up. This would be addressed by a future extension to the points app, as the whole system is being built with modularity in mind. So there will be an investments add-on, assets add-on, marketplace add-on, giveaways add-on (for lotteries, raffles, etc). I believe the concept for this would fall under "assets" as it would be an individual item which could be transferred around and would have it's own individual history and points value which would increase or decrease based on rules. And so the asset could then be liquidated into currency and used to make a purchase, etc.
  21. 1 point
    The following api method is made available through the points economy application to get the points balance for a member. Get A Member Balance class \IPS\Member /** * Get Balance * * @param int|\IPS\points\Currency $currency Currency or currency id * @param int|\IPS\points\Bank $bank Bank or bank id * @return \IPS\points\Balance * @throws \IPS\points\Exception An exception is thrown if the balance is not permitted */ public function balance( $currency, $bank=0 ); Example: /* Load member */ $member = \IPS\Member::load( 1 ); try { /* Get member balance for currency #1 and bank #0 ( spending account ) */ $balance = $member->balance( 1, 0 ); /* Total balance amount */ $total = $balance->amount; /* Available balance amount */ $available = $balance->available; /* Get Amount Being Held */ $holding = $balance->holding; /* Get Amount Of Unclaimed Credit */ $unclaimed = $balance->unclaimed; /* Get Amount Of Pending Debits */ $unpaid = $balance->unpaid; } catch( \IPS\points\Exception $e ) { /* Points balance is not permitted */ $reason = $e->getMessage(); }
  22. 1 point
    This is a rather minor suggestion from me, but could potentially be important for those groups that need to verify certain things. Allow group owners / leaders to modify and add questions to join the group. This can help fine-tune and filter prospective members.
  23. 1 point
    Part of the issue with awards is that there needs to be an action to remove an award so that you can effectively issue an award for 250 posts, remove that award at 500 and then issue 500 post award and so on. Without the removal option within the ECA's its not really achievable. I know that RAW is working on implementing this but I have to say - its brilliant that its been integrated with Rules.
  24. 1 point
    Hi, The action to send a private message to users who are following a topic is great. However, the message adds all followers to the recipient list, which in our case is not desireable, as if one of them decide to reply, the answer will be sent to all other followers. Therefore, my suggestion is to add an option to send individual messages to the followers, rather than one single message copied to all followers. Thanks.
  25. 1 point
    By adding a rules extension to your application, you will allow users to automate features of your application using rules, and tie your application into customized workflows created by the client. Here are the basic steps to add your own ECA’s to rules. If you already have an application in development, then you will likely skip steps 2 and 3. 1. Install the IPS Rules or IPS Rules LITE application to your site 2. Enable developer mode on your IPS4 site 3. Create a new application 4. Go to the “Developer center” for your application 5. Go to the “Extensions” tab in the developer center 6. Click the “rules” extensions list 7. Click the icon to add a new extension (give it a relevant ExtensionClassName ) Definitions Extensions A definition extension is used to add new events, conditions, and actions which are specific to your application. One extension can be used for all of your ECA’s, or you can split ECA’s up across multiple extension classes. When an ECA is used, only the extension class that it is located in needs to be loaded. So if you are implementing a large amount of ECA’s, there will be a performance benefit of splitting them up across multiple extensions. Conversions Extensions A conversion extension is used to make additional arguments available for configuration in rules based on available event arguments. For example, a conversion definition may tell rules how to derive the total number of achievements a user has when the \IPS\Member object is available. Adding Events By triggering an event in your application code, end users will be able to create rules that take actions in response to that event. To add an event to rules, follow these steps. 1. Create an event trigger somewhere in your application code: if ( \IPS\Application::appIsEnabled( ‘rules’ ) ) { \IPS\rules\Event::load( ‘myapp’, ‘ExtensionClassName’, ‘event_key’ )->trigger( $arg1, $arg2 ); } 2. Add the event details to the events() method in your extension class: public function events() { $events = array( ‘event_key’ => array( ‘arguments’ => array( ‘arg1’ => array( ‘argtype’ => ‘int’ ), ‘arg2’ => array( ‘argtype’ => ‘string’ ), ), ), ); return $events; } 3. Create language strings for the event (and any arguments sent by your event) in your lang.php file. $lang = array( '{myapp}_{ExtensionClassName}_event_{event_key}' => 'Event description', '{myapp}_{ExtensionClassName}_event_{event_key}_{arg1}' => 'Argument description', ); Adding Conditions By adding conditions to your rules extension, end users will be able to perform conditional tests in their rules related to your application. 1. Add the condition details to the conditions() method in your extension class. You will provide the name of a callback function that returns a TRUE/FALSE value, and a description of the arguments which should be passed to that callback function. public function conditions() { $conditions = array( ‘condition_key’ => array( ‘callback’ => array( $this, ‘callbackMethod’ ), ‘arguments’ => array( ‘member’ => array( ‘argtype’ => ‘object’, ‘class’ => ‘\IPS\Member’, ‘required’ => TRUE, ), ), ), ); return $conditions; } 2. Add the condition callback function to your extension class: public function callbackMethod( $member ) { if ( ! $member instanceof \IPS\Member ) { throw new \UnexpectedValueException( ‘Invalid member object’ ); } /* Return result from your conditional check */ return $member->posts > 0; } 3. Create language strings for the condition (and any arguments used by your condition callback) in your lang.php file. $lang = array( '{myapp}_{ExtensionClassName}_conditions_{condition_key}' => 'Condition description', '{myapp}_{ExtensionClassName}_conditions_{condition_key}_{arg1}' => 'Argument description', ); Adding Actions By adding actions to your rules extension, end users will be able to perform operations related to your application in an automated way through the rules they configure. 1. Add the action details to the actions() method in your extension class. You will provide the name of a callback function that will perform the action, and a description of the arguments which should be passed to that callback function. public function actions() { $actions = array( ‘action_key’ => array( ‘callback’ => array( $this, ‘actionCallback’ ), ‘arguments’ => array( ‘member’ => array( ‘argtype’ => ‘object’, ‘class’ => ‘\IPS\Member’, ‘required’ => TRUE, ), 'title' => array( 'argtype' => 'string', ), ), ), ); return $actions; } 2. Add the action callback function to your extension class: public function actionCallback( $member, $title ) { if ( ! $member instanceof \IPS\Member ) { throw new \UnexpectedValueException( ‘Invalid member object’ ); } $member->member_title = $title; $member->save(); return "member title updated"; } 3. Create language strings for the condition (and any arguments used by your condition callback) in your lang.php file. $lang = array( '{myapp}_{ExtensionClassName}_actions_{action_key}' => 'Action description', '{myapp}_{ExtensionClassName}_actions_{action_key}_{arg1}' => 'Argument description', );