Do we really need another Video Game Website?

I'm working on a website project, that I'm tentatively calling django-frogohs. I'm using this thread to blog my progress and stay motivated, and hopefully get feedback and / or ideas.

The issue list is here, and should be public, though you might need to sign up for a bitbucket account to create or comment on issues.


I mentioned briefly on twitter last week that I have had this gaming site idea stuck in my head for like 4 years now, and I think I've finally hit the point where I need to make it, if for no other reason than to be able to stop thinking about it. Unfortunately, it isn't terribly original. Most of the features I have in mind exist in one site or another, but I haven't seem them all in the same site. So yes, I think it would be useful, but it would require a ton of work just to get parity with other sites, before even working on the stuff that is original (or at least less common).

If I'm actually going to get a site live this time (rather than languish after a couple weeks like I usually do), I need to keep motivated and focused.

For keeping focused, I'm going to work in thin horizontal slices (e.g. data-model, UI for admin, search, list and detail for platforms). Before I've typically done vertical slices (e.g. the entire data model) and it's led to burn out.

For keeping motivated, I want to be working on the right things. For first release (whenever the hell that ends up being), I want to find the minimum set of useful functionality. For that, I come to you guys.

Features I had planned:

  • Game data. This is a lot of standard game database stuff, like which platforms a game is available on, and dev / publisher info. This might be as simple as a field for dev name and pub name, or a more general credits system, with Company Roles (dev studio), Person Roles (lead designer), and Acting Credits (VO + Mocap for a character). GiantBomb has a lot of this info but it is in wiki format, rather than structured data.
  • Game Attributes. I'm not a fan of genres for describing things as I think they are too limited. I'd like more granular data like Perspective (e.g. First person, fixed, over-the-shoulder, etc), mechanics (e.g. Gun-combat, Melee-combat, Turn-based, etc) and modes (Solo-campaign, Team Deathmatch, Hordemode, etc). This might be as simple as a tagging system, or more detailed.
  • Recommendation system. This is why I want the previous two items as structured data. Ideally, the system would be able to recommend games to you based on ratings. In the short term though, I would probably require actively searching. You like games by a particular designer, you can search on that. Particular mechanics, you can search on that.
  • For the requisite rating system, I tend to think of even the 5 stars system more granular than is useful (nevermind confusing if there are "0 stars" ratings), and was thinking of a simple "Must play / Whatever / Avoid" system.
  • Trading / Lending system - this idea originally came up because guys at my last job would often lend games out to each other, mostly by asking if someone had a particular game you were interested in. I thought it would be cool to have a system that allowed you to search for a game and find people who were willing to lend it to you. Goozex sort of does (as does a site called gametz that I found during research) this, but it was meant for lending, not trading, and was meant for in person lending / borrowing. It would probably need Lending Groups to be useful for this. I don't really want to build a full trading system, but an additional flag would be okay (e.g. "Willing to Lend" plus "Willing to Trade / Sell").
  • List management. Collection, Played, Currently playing would probably be the same list, with filtering options (like backloggery). Wishlist could also have options for "Want to own" / "Plan to buy at release" / "Want to borrow" to hook into the lending system
  • Playthrough information, like howlongtobeat. Possibly including a flag for whether the game has an in-game clock so you know if it is an estimate or exact time.
  • Steam / XBL / PSN integration - Pull in games and achievements to populate lists. Perhaps auto-create playthrough info for steam games. Perhaps tag achievements so that I can do things like hook into the backlog system and automatically mark the game complete when you get the "Beat the game" achievement. Steam and XBL both have official APIs. I thought PSN got rid of theirs, but I know a few sites that support it, so there must be some solution.

There might be others that I've forgotten, but those are the big ones.

So, goodjer collective:

Would you use a site like this?
What are the minimum features to get you to shift from whatever you're using and use this?
Does something like this already exist and I'm wasting my time?
Any major features I'm missing?

If you could do something like backloggery that would actually populate based on your live/psn profile - you would get my money.

Trading/Lending would be awesome as well. I used to use Switchgames, but that went the way of the dodo.

I don't anticipate that I'd use the trading/lending feature all that much, but the rest of it would be awesome.

I like Backloggery for tracking my collection, but it does take a lot of manual work to start and to maintain. I primarily used True Achievements for automatically tracking completion percentage for games and as a means of setting goals, but I didn't like that those features were hooked into a larger meta-gaming system. And howlongtobeat is a neat site, but it has the same problem as Backloggery that it requires a lot of manual work, and I already have a carefully groomed Backloggery account.

What's really hooked me into Backloggery are the statistics: what percentage of my collection is unfinished or unplayed, what percentage is beaten, etc.

One feature suggestion: it'd be awesome to auto-populate your collection based on your Gamertag/Steam ID/whatever, but would you please give users the option to exclude games? I wouldn't want a rental showing up as part of my collection, for example, and some games just get the ax even if I own them digitally for all time.

Two votes for Backloggery with Autopopulation.

Honestly, I found backloggery originally a few years ago when I was looking for a site that did what I wanted. I started using it because it seemed useful, and at least I could point people to games I was willing to lend.

Honestly, I'm not sure I'd use the trading feature much either anymore. I'm at a new job now and we just don't talk games here much. Plus, I've been focusing on the pile and PC games, so I wouldn't trade much now. It might be useful for the game specific trades that go on in The Official Trading Post thread.

I avoided howlongtobeat for the same reason, clock: I already have backloggery with friends there. I actually do use HLTB sometimes now, but it is a secondary system.

I'm not huge into stats myself, though I use them sometimes. I don't think they would be terribly hard to implement, at least for individuals, though I'd need to find a good graph library.

I definitely agree about excluding games. I just track backlog on backloggery now, but when I was tracking my whole collection / played-games list, I used the "Rented / Borrowed" option, but I don't think the stats took that into account. Personally, I like being able to see stuff I've played, even if it isn't stuff I own. TrueAchievements also lets you exclude games, but they don't handle it the way I like. If you exclude a game, it removes it from everything. Sometimes I want to remove it because I don't want to see it at all, but a lot of time I want to see it, but I don't want TA to suggest achievements for games I don't own ("Easy Achievements" for example). I think a simple "Owned" flag would be enough.

It sounds pretty good to me. When I read "another gaming site", I thought you meant another editorial site but this seems to be more of a social utility and it sounds pretty cool the way you want to go about it. Some sites are doing what you are talking about but not necessarily the way you're talking about doing it. Colour me interested.

Will you sell my data to 3rd parties? If so, can I get a cut?

A video game social network, huh. I'd be very into that.

Atomicvideohead wrote:

A video game social network, huh. I'd be very into that.

Didn't they already try that with that game idea thingy? I remember signing up to something along those lines a few years back. It was posted on here..... if i could just remember the name....

[edit]
Ah, this was it but it's shut up shop...

Parallax Abstraction wrote:

It sounds pretty good to me. When I read "another gaming site", I thought you meant another editorial site but this seems to be more of a social utility and it sounds pretty cool the way you want to go about it. Some sites are doing what you are talking about but not necessarily the way you're talking about doing it. Colour me interested. :)

That's the main issue. All this stuff pretty much already exists, but not in the form I'd want to use it. I guess I'm trying to gauge how much interest there in "How I Want To Do It"™

Atomicvideohead wrote:

A video game social network, huh. I'd be very into that.

I didn't think I was envisioning anything so grand, but yeah, I suppose it could be.

For the immediate future, I think I'm going to focus on getting the infrastructure for the games database in place, at which point I will probably do a first release. After that will probably be (manual) collection and backlog tracking for users, followed by steam / xbl / psn integration. I have a feeling dealing with those APIs will be a bit of a pain.

The issue list is here if anyone wants to track progress, add comments, or suggest ideas.

What would be both handy and extremely dangerous to stack height would be the ability to tag items with "let me know when price is less than $x at Steam/GOG/Impulse/etc". Kind of like http://www.steamwatch.com/ but with more features.

Metacritic & review data. If people prefer particular review sites, maybe the option to just turn on reviews from specific sites?

How about the question of ratings with & without game-changing patches? I've never seen that done.

I like multiple types of game. For example I like solo story-driven games (e.g. ME3), but also multiplayer TF2. If you can somehow work an "if you like this, you'll like that" system that understands I don't just like one type of game, that would be good. i.e. I wouldn't want the next TF2 to be marked down in a rating system because I mark that I like plot-driven games.

Thanks for the suggestions.

These first two seem cool, but personally I'd put them a low priority, unless there is a ton of interest. There are sites that have this information already, and these features aren't on my "no one does them quite right" list.

Cod wrote:

What would be both handy and extremely dangerous to stack height would be the ability to tag items with "let me know when price is less than $x at Steam/GOG/Impulse/etc". Kind of like http://www.steamwatch.com/ but with more features.

Metacritic & review data. If people prefer particular review sites, maybe the option to just turn on reviews from specific sites?

The alerts themselves I don't think would be that difficult. Getting the price data will be a challenge. Presumably steam has that info through their API, but I don't know about GOG, or Impulse, or Amazon or whatever. Metacritic is the same thing thing, really, in that I don't know if they have an API. I'd like to avoid screen scraping if possible. I think if / when these features go in will be determined by how hard the implementation is.

Cod wrote:

How about the question of ratings with & without game-changing patches? I've never seen that done.

Can you explain more what you're thinking here? What qualifies as game changing? Most of the time you pretty much have to use the latest patch anyway. How would it make a difference? I can think of one major difference, and that's TF2 on 360 vs PC. Because 360 never got the patches, it is now (supposedly) a wildly different game. I'm not sure how often that kind of thing happens though, and I'm not sure it makes sense to build a feature around an edge case without more info.

Cod wrote:

I like multiple types of game. For example I like solo story-driven games (e.g. ME3), but also multiplayer TF2. If you can somehow work an "if you like this, you'll like that" system that understands I don't just like one type of game, that would be good. i.e. I wouldn't want the next TF2 to be marked down in a rating system because I mark that I like plot-driven games.

That's actually pretty much exactly what I was planning to do with the Mode / Mechanic / Perspective information, and is really the feature I'm most excited about. I wanted to basically tag a game with a bunch of data and use that, along with the rating system to suggest other games you might like. Although, it just occurred to me that the rating might need to be at the mode level, since some people have preferences for multiplayer, or single player or co-op or whatever, to the point that they are almost separate games sometimes. If that's the case, things like mechanics or perspectives might need to be at that level as well.

Update time.

I've been working on this a bit, though not as much as I should. Well, I have been thinking about it quite a bit (largely trying to understand best practices around project structure and whatnot for the framework I'm using), but not much in the way of coding.

I finally have the first feature done: Platforms!

There is a simple list of platforms with links to the detail page for each, which shows the name and the logo.

It's boring, but it's progress.

It's not up anywhere right now, and probably won't be until I have a bit more to show. If your exceptionally curious, you are welcome to clone the repo and poke at it, though I'm not planning on taking code-level contributions at the moment. Feedback, however is more than welcome. Post here, or in the issue list. Comment on issues. Add issues if they aren't there. Whatever.

Another two months and I don't have much to show for it. Part of that I can blame on the stress of moving. I've been moved in and unpacked for about 2 weeks. I have picked this project up again and made some progress since then. I think using this thread as a live blog of sorts for my progress will help keep me motivated. Hopefully other Goodjers find it interesting as well.

User visible stuff
I didn't mention this before, but I'm calling the project Frogohs right now. I may change it to a "real" site name later, but I thought it was a good starting point, that goodjers would appreciate. This is not live, so there isn't a domain yet. I'm hoping to get enough progress in the next few weeks to justify at least a beta release.

I had platforms with list and detail pages in the last update. I added Distribution Methods (e.g. steam), and a relationship between them, which is Many-to-Many, and can be marked as transferable. There is also initial data for all these objects. I've thought about which platforms and dist methods to include, but I'm open to suggestions if you think I've missed something important. The current data in the system is here.

Only Physical Media on console or handheld platforms are marked as transferable. I don't have any immediate plans for this field, so it is really just informational at this point.

The platform detail page and the dist method detail page both have "nice" urls. What I mean, is that rather than an ID, I use a "slug" field. So, e.g. the Xbox 360 page would be at frogohs.com/vgdb/platforms/xbox-360, rather than frogohs.com/vgdb/platforms/2.

Boring, back-end stuff
I setup my local environment to use virtualenv to isolate my project from other stuff on my system. Pretty standard for Python, but this is the first time I've used it.

I also created requirements files to track my dependencies. Right now, everything is in requirements/common.txt. There are also dev and prod versions, but they just point to the common one. There is also a top level version that just points to the prod version.

requirements/ common.txt dev.txt prod.txt requirements.txt

I started using South for Database migrations. This makes it easier to make changes to my data model, and change data for it. For example, if I add a field to a model, it won't be seen by syncdb (the method built into django), so I'd have to manually write the SQL script to update the database, and it might be different for different backends. With south, I can make the change to the class, and have south generate the changes in a back-end agnostic way. It also essentially installs a time machine in my database, as it lets me move to a particular migration, even if it isn't the latest.

Next up

This morning I installed the django registration app, but it doesn't come with default templates, so I need to either find some, or make my own. Once I have those, users will be able to sign up for their own accounts. Right now, I'd have to make each one individually.

I also need to switch my dev environment database to PostgreSQL. I'm using SQLite, which is missing some features of a "real" RDBMS, so south doesn't play as nice with it. Plus, Production will probably be on Postgres anyway.

For actual feature work, next up is adding games to your collection. Like backloggery, there won't be a list of game to choose from (that comes later), just a text field and a pick list for the platform and distribution method. I wanted the user to be able to add a game, even if it isn't in the database, plus it lets me get something out quicker.

To your media list I'd add the Apple OS AppStore (non-transferrable) for Macs and the DSiWare shop (non-transferrable). The DSiWare shop is only for the DSi; the DS doesn't have it and the 3DS uses the eShop for DSi games.

ClockworkHouse wrote:

To your media list I'd add the Apple OS AppStore (non-transferrable) for Macs and the DSiWare shop (non-transferrable). The DSiWare shop is only for the DSi; the DS doesn't have it and the 3DS uses the eShop for DSi games.

I can definitely add Apple OS Appstore.

I thought about DSiWare, and decided to put if off (honestly, I hoped no one would notice). DSiWare is an odd edge case, since, for the most part, DSi is a revision of the DS hardware. Another edge case is stuff like Xbox games that are playable on 360. Both of those are "old" systems though.

I started an "Only the Awesome" thread a while back. One of the criteria in that thread was that it has to be easily attainable and playable, which left out some older systems. DS gets listed because there are new games coming out for it, and I didn't list Original Xbox (nor PS2, which might be an oversight).

Also, for background, I'm defining Platform as a combination of Hardware and OS (both high level) needed to run the game. So for example, Windows and Mac are different, since they are different OSs, despite (theoretically) being the same hardware (well, class of hardware anyway). Windows is not being broken down into different versions (7 vs Vista vs XP, etc).

However, Xbox 360 isn't being broken down into 360 games, XBLA games, 360 Games on Demand, XBL Indie Games, either at the platform level, or the dist method level. They are all games that require a 360 to play, with 360 games on disc being under Physical media, and Games on Demand, XBLA, XBLIG and Xbox Originals being under Xbox Live Marketplace. Wii Ware vs Virtual Console is the same deal.

Worked on it some more this weekend. Mostly on the boring, back end stuff.

I finished implementing the django-registration app. The app itself is pretty well done, but doesn't come with any templates, so that's the part I had to implement. I started by reading though a tutorial to understand how it works, and using their templates. However, they didn't list examples for all templates, and I was feeling lazy, so I googled a bit and found an app called (appropriately) django-registration-defaults. I also had to set up email for sending registration emails. The tutorial mentioned that I could use Gmail's SMTP server, so I tried that, using the name and password for my gmail account. That worked nicely. And then.... I stupidly checked that into source control. So I generated a new password and off we go.

I also worked a bit on the project structure and broke my settings file into 3: common, dev and prod. There isn't much difference between DEV and PROD right now, and most of the settings are in COMMON. I still need to move stuff like passwords and DB connections out of the settings file entirely, as they shouldn't be under source control. It's a start though.

The front end stuff isn't terribly interesting either: I added DSi Shop and the Mac App Store to the Dist Methods, and added links to the relevant platforms. For the DSi Shop, I just connected it to the DS (though I just noticed that I made it transferable; I'll have to fix that when I get home). I think this will be good enough for now. I might add hardware iterations and cross compatibility some time later, but for now, I think simpler is better. I'd love to hear thoughts on this, though. Edge cases are a pain, and another opinion is always welcome.

Next, I plan to work on the collection management stuff. That may take a while to finish as I need to break the problem down and figure out how I want to handle it. For example, do I want to store Collection | Played but not owned | Wishlist all in one structure, or should they be handled differently?

Garden Ninja wrote:

And then.... I stupidly checked that into source control. So I generated a new password and off we go.

Hehe, been there, done that.

Neato overall. Keep us updated!

So... I uh, extracted the email settings into a separate file this morning, and added that file to the ignore list.

[size=10]*cough*like I should have done originally but didn't because I was lazy*cough*[/size]

I also started working on the collection management module. I didn't have a lot of time this morning, so I didn't really get any farther than creating the skeleton of the module (which django does for you). Oh, and coming up with the name for the module. That was the hard part, honest!

Also, forgot to mention in my previous update, that I started implementing django's internationalization framework. Look like it is pretty easy to stick in translatable strings, but actually creating the files to hold the translations was not as trivial as the tutorial made it look. It just isn't terribly sexy, and I wanted to work on features, so I rolled the changes back and decided to read up on how it works more, and try again later. I wasn't planning on supporting anything besides English right away anyway, but using the framework is the "right way" to do it, even for just one language, and it would set me up for a translation later.

I stubbed out the collection management module, as I mentioned before.

I did a bit of design at the end of last week, and came up with a few model classes:

Profile - This is the only one that's implemented. At the moment, this just has a link to the user. Eventually, module level preferences will be stored there. I also thought it would be cleaner to have the other models go though the profile, rather to avoid polluting the auth.User model. Django allows you to set the module to use as the profile for the project level, but I decided not to use it, since I'm not sure what it actually gets you, and I wanted to keep my modules as independent as possible. Instead, I added a signal callback so that when the user is created, the profile is created as well. Eventually, I may have a site level profile class, but it will just be a collection of the module level profiles.

ProfileGame - This is very simple right now. There will be a text field for the game name, a pick list for the platform and distribution methods, and ownership status. Since I'm not going to list all platforms and dist methods, I might have an "Other" field for those. I'm also not sure how granular to get with Ownership status. I initially brainstormed a rather long list:

  • Own
  • Sold / Traded
  • Borrowed / Rented
  • Currently Borrowing / Renting
  • Want to Borrow / Rent
  • Want to Buy

Those all basically boil down to three though: Collection, Played (but don't own), Wishlist.

Eventually, you will be able to choose from a list of games in the database, and connect existing games to database games.

Playthrough - This is sort of a mix of how Backloggery (collection plus status) and Howlongtobeat work (just playthoughs). It will have a link to the ProfileGame, Playthough status, optional time span, and maybe a note. Playthough status would be Now playing, Finished or abandoned. Unplayed would just be games without playthrough information. I also need to handle games that aren't really beatable (and therefore shouldn't show as Unplayed). That might be a flag on the game, or it could be a "Not Applicable" playthrough status.

Found and fixed a bug. I need to make sure that the profile record exists for each user when you try to view the profile page. Initially I was using a signal to create the Profile record at the same time as the User record was being created. This worked pretty well. However, I borked a migration and had to rebuild the database from scratch, which exposed the problem. The signal was running for the admin user, created during syncdb, and failing since the profile table didn't exist at that point. To fix it, I deleted the signal code and modified the Profile Detail View so that it will load profile for the user, or create it if it doesn't exist.

I also started working tracking games tied to a profile. At the moment, you can add games (if you have the direct link), and view the list of games. Both pages look like butt right now, but it's a start. I still need to add updating and deleting games, add a check so you can only edit your own games, and clean up the UI (connect the pages together, make it non-ugly, etc).

I also wanted to say that I'm really digging Django's Generic Views. Most web apps have a bunch of the same kinds of pages, that get repeated all over the place.

  • Show a list of Things
  • Show a single Thing
  • Add a Thing
  • Edit a Thing
  • Delete a Thing

For dead simple cases, you just have to sub-class the appropriate view and specify a couple of properties, like the model class that the view is for (the model property, which part of a URL represents the lookup key (the slug_url_kwarg property), and which field on the model to use for lookup (the slug_field property). For example, for ProfileDetailView, I wanted to look up the profile based on the Username (which is on a different model) instead of an integer id. Because of how the query API works, I can specify slug_field = 'user__username', and it just works. The slightly tricky part, was that, because of the bug mentioned above, I needed to create the profile on demand if it didn't exist. All I had to do was override get_object with that logic. Actually, I ended up extracting that logic into a mixin class that I can use in all my views. Multiple inheritance can cause all sorts of problems if you aren't careful, and many languages don't even allow it (or constrain it to interfaces). I hadn't used it in Python before, but it seems like simple mixin classes are pretty easy.

The view for creating a new game for your profile is also pretty simple. Showing an editor form for a model is also a pretty standard thing, and Django makes that easy as well. At it's simplest, you just have to subclass ModelForm, and set the model class to use, and use that form in your view. In my case, I didn't want the user to select which Profile they were adding the game to, since they would always be adding games within the context of a particular profile. This is what the exclude property of the form is for: keeping certain fields from rendering. I still need to set the profile field however, so I overrode form_valid to set the field, prior to saving the new game record to the database. Last, I needed to override get_success_url() so that the view will redirect to the profile after saving.

6 ½ weeks since my last update and I have... well, not much to show for it honestly. Life got stupid busy, so I didn't really touch the project for a while. I did finally poke at it a bit more earlier in the week though.

I added a Project module to link the other modules together. Django apps are built up of small, mostly self-contained modules, and glued together. The problem is that I couldn't find any official docs talking about how to structure that glue code. Googling around on the topic didn't really provide much useful information. The closest I found was one guy on stackoverflow saying that he creates a "website" module and sticks his glue code in there. That sounded reasonable, but I didn't like name website, since a django project isn't necessarily a web site (even if it usually is). I decided to call it "project", though come to think of it, "main" might work better; I may rename it to that.

I worked a bit on site structure and style. Each browser has different ideas about what the default styles for a given element should be. I used a Reset CSS file to start with an even playing field, thought I'm only developing in Chrome right now. I did a bit of work aside from that, but not much more really than sticking a header at the top and setting a background color for the page. I still haven't even decided on a color scheme, since I figure I can worry about that I have some functionality.

Aside from that, I really just added links between the pages and added a page to delete a Profile Game.

Keeep poking. Keeeeeeep poking.

Yes, the styling of HTML form controls is a hot mess. There are a number of things out there that try to normalize things for you a bit, such as Uniform.js

I don't remember having trouble getting fieldset/legend tags to do what I wanted once I had rules to override the UA's default styles, but what you came up with should be just fine as well. Just get something that works and isn't horrible, rather than spending hours fussing over the markup not being as semantic as it could possibly be.

More poking, as requested!

Apparently last time, I hadn't created a page to delete games, like I thought, but that is done in this commit.

The big thing I worked on, though, was styles, especially around forms.

I wanted to enclose forms in some kind of container, with a differently colored header at the top describing the purpose of the form, and rounded corners. Complex forms, if I need them at some point, would be made of multiple of these sections.

I'll try to post a screenshot of the result later, but for now, here is a random sample from Google, that gives you a rough idea of what I mean.

IMAGE(http://blog.tmimgcdn.com/wp-content/uploads/2012/10/preview-sliding-form-tutorial-demo1.png?9d7bd4)

I tried for a while using fieldsets and legends to break up the Game Edit form, since I'm a fan of using markup to provide semantic info about the page, and those elements provide semantic info for breaking up a form. However, those elements, along with most form elements (buttons, checkboxes, radio buttons, etc) are actually passed off to the OS to render, and because of that, they are a massive pain in the butt to style, and in some cases it isn't clear how they should be handled, even if they did respond to CSS. I eventually gave up on getting fieldset and legend to work, and replaced them with the new HTML elements section and hgroup, with an h1 to contain the actual header text. It is still semantic markup, but not specific to forms.

Rounded corners used to be a huge pain, but with CSS3, it's actually really easy, but there are some quirks. You use the border-radius property. However, it behaves a bit oddly when there are child content. In this case, I made my hgroup a dark background color, and put border radius on the section which contains it. This led to a smooth rounded corner on the outside, with a sharp corner on the inside. Trying to set the border radius on the hgroup led to weird results as well. My solution was to put the border and radius on just the hgroup, and the sibling element which contains the main content of the form. The result looks decent, but I want to play with it some more, as I'm sure there is a better way, plus I don't want to pigeon hole myself, in case I find the need for a section without a header.

psoplayer wrote:

Yes, the styling of HTML form controls is a hot mess. There are a number of things out there that try to normalize things for you a bit, such as Uniform.js

I don't remember having trouble getting fieldset/legend tags to do what I wanted once I had rules to override the UA's default styles, but what you came up with should be just fine as well. Just get something that works and isn't horrible, rather than spending hours fussing over the markup not being as semantic as it could possibly be.

Basically. I probably could find style rules that give me what I want, but I put a couple hours into it and it isn't worth more hassle than that. Uniform.js looks nice, but I'd rather use CSS for styling, and use JS for actual functionality. For the most part, I'm going to leave form element alone, except for buttons. For semantic reasons, and usability reasons, I'm using buttons for actions like updating, or confirming a deletion, but anchors for the cancel button, since that isn't really an action, it's just going somewhere. However, from a UI standpoint, I'd like them to look the same on the form.

I was using Eric Meyer's reset.css which basically nullifies all UA styles, except for form elements. However, in googling around today, I stumbled on an alternative called normalize.css. Where reset.css aims to start from scratch in all browsers, normalize.css aims for consistency across browsers, but leaves some defaults in place, and it does actually apply some styles to forms. Sometime in the next few days, I want to play with a bit, and I may use that instead of reset.css.

LTTP, just for a change, but raptr seems to be doing stuff in a cool manner of late. I think we may have mentioned it in passing in the TA thread.

It kind of takes TA's friend and stat feed, presents it leaderboard style, per game, then adds another layer of differentiation (casual, dedicated, hero, some other guff) depending on no. of Cheevs and difficulty of those Cheevs to obtain.

There is a 'wall style' posting area, like FB and Fitocracy too.

Actually, if we're talking Fitocracy, I'd really like to see the ability to set up community based challenges too. That could drive the social side considerably, be an expansion on the TA goal system, and give you an edge.

360voice is meant to have a feature like this, but I think it's pretty well buried, or it was last time I looked.

I'll echo Monkeyboy. I fell into Raptr after coming really LTTP to xfire and finding it a terrible mess after a month of it seeming to work well. Now I use Raptr, and I like how it tracks anything that can be pulled from an online profile, and lets me compare achievements / trophies in a very clear way, although I seem to have issues getting to that screen.

Of course, now I want to compare the same game across other platforms. Like my progress in Batman: Arkham City PS3, vs others on 360 and Steam. I wonder how hard it would be to line that up. Says the man who knows nothing about how this works.

Also, all the consoles need to start tracking time played and the length of each individual play session like the Wii (Steam doesn't even do this), and Nintendo needs to get that stuff accessible online. I know they have it on their servers in some form as they post the total time played for the game globally, number of play sessions globally, average play session per user, and average number of times played per user to their Nintendo Channel.

m0nk3yboy wrote:

LTTP, just for a change, but raptr seems to be doing stuff in a cool manner of late. I think we may have mentioned it in passing in the TA thread.

It kind of takes TA's friend and stat feed, presents it leaderboard style, per game, then adds another layer of differentiation (casual, dedicated, hero, some other guff) depending on no. of Cheevs and difficulty of those Cheevs to obtain.

There is a 'wall style' posting area, like FB and Fitocracy too.

I remember talking about Raptr in the TA thread. I also remember not liking it, unfortunately. That was in August. Has it changed in the past couple of months? At a glance, it still looks like a mess.

Actually, if we're talking Fitocracy, I'd really like to see the ability to set up community based challenges too. That could drive the social side considerably, be an expansion on the TA goal system, and give you an edge.

360voice is meant to have a feature like this, but I think it's pretty well buried, or it was last time I looked.

I don't really use Fitocracy. How do the challenges work?

mrtomaytohead wrote:

I'll echo Monkeyboy. I fell into Raptr after coming really LTTP to xfire and finding it a terrible mess after a month of it seeming to work well. Now I use Raptr, and I like how it tracks anything that can be pulled from an online profile, and lets me compare achievements / trophies in a very clear way, although I seem to have issues getting to that screen.

Of course, now I want to compare the same game across other platforms. Like my progress in Batman: Arkham City PS3, vs others on 360 and Steam. I wonder how hard it would be to line that up. Says the man who knows nothing about how this works.

That was actually in the plan. The achievement tracking / comparison stuff is going to be cross platform, probably with the option to filter. There are a couple of edge cases that I'm not sure how I'd handle (like TF2 is part of Orange Box on 360, but standalone, and has over 400 achievements on PC), but for the most part it should be straightforward.

Also, all the consoles need to start tracking time played and the length of each individual play session like the Wii (Steam doesn't even do this), and Nintendo needs to get that stuff accessible online. I know they have it on their servers in some form as they post the total time played for the game globally, number of play sessions globally, average play session per user, and average number of times played per user to their Nintendo Channel.

That would be sweet. Steam is only system that offers playtime info at all, and even then it is just total for a game. The one cool thing I planned to do with it is automatically update your playthrough info. Like, if you list a completed playthrough at 17 hours for a game, more time over that would start tracking in a new playthrough.

Garden Ninja wrote:
Also, all the consoles need to start tracking time played and the length of each individual play session like the Wii (Steam doesn't even do this), and Nintendo needs to get that stuff accessible online. I know they have it on their servers in some form as they post the total time played for the game globally, number of play sessions globally, average play session per user, and average number of times played per user to their Nintendo Channel.

That would be sweet. Steam is only system that offers playtime info at all, and even then it is just total for a game. The one cool thing I planned to do with it is automatically update your playthrough info. Like, if you list a completed playthrough at 17 hours for a game, more time over that would start tracking in a new playthrough.

What makes it even worse is on the Wii, you can actually go into the Nintendo Channel and see your total time played and number of times played, and via the message board, I can track each individual play session all the way back to the day I got my Wii at launch. It's all there, just not available to view online, which makes it so annoying.

It's a real mess still, but it's a bit like finding diamonds in a dog turd.

All the points mentioned by mrtomaytohead are the bits I like, but the layout is a hell of a mess.

I don't so much use the site, as watch it. I only sit on my own profile page, and rarely venture outside of that space.

Time for another update.

I added some security to the views so you aren't able to edit other users' profiles. In fact, the before this, it was wide open and you didn't even have to be logged in. Now, it won't render the add, edit or delete buttons on other people's profile, and if you happen to type the URL in directly, it will throw a PermissionDenied exception, which causes an HTTP 403 response.

The code that does this is really kludgy, and I feel like there has to be a better way to do it. Basically, I check a property to determine whether I need to secure the view, then check if the logged in user is the owner of the profile and throw an exception if not. Django does provide view decorators that can check if the user is logged in, has a certain permission, or passes some other test. The "has permission" check is sort of what I want, but I need "has permission on this object" not has permission in general". In any case, I think the decorator logic happens outside of the view function itself, so if it worked at all, I would have to re-implement the logic that I already have in my view.

This works for now, but there are a couple of things I would like to fix later: First, newer version of Django supposedly supports per-object security through plugins, and that might be a better way to determine whether you can edit a profile. Second, I feel like "Secure this view on this object" is pretty standard, so I'm hoping I can find some info on where I should put this code. There must be a library that has a mixin I could include in my secure views. If not, I don't think it would be too difficult to write one.

I also added an Ownership Status to the games, so that you can mark whether a game is Owned, Unowned (borrowed, rented, or sold/traded), or on your Wishlist. Right now you can see this information on the List, Detail, and Edit Form pages. Actually being able to filter is next. The two obvious ones would be Owned+Unowned (i.e. actually played) and Wishlist, though it probably makes sense to allow users to show just Owned, or just Unowned, or even all three lists on the same page.

Here are some screenshots:

This is the Edit Game Info screen. The circled bit is the rounded corner look I mentioned a couple of updates ago. I did figure out how to set the border on the section, rather than the contents of the section. Turns out I just needed overflow: hidden; on the section itself to keep the header from clipping through.
IMAGE(http://i.imgur.com/2fJuN.jpg)

And here is the game list page
IMAGE(http://i.imgur.com/0WSi7.jpg)