Archive

Archive for the ‘Blog’ Category

Unbearable does Drak'Tharon Keep

Another recording, just to play around some more.

Unbearable does Utgarde Pinnacle

Wanted to play around a bit with Xfire Video Recording. It does a pretty good job.

Status Press Widget

December 23rd, 2009 Brian Schmidt Pedersen No comments

I’ve been playing around a bit with Status Press Widget by Brian D. Goad.

I found that the data it fetched also showed the nick-/username which I think is kinda redundant so I modified the plugin a bit to let me manage it from the admin interface. While at it I also modified so URL’s are made clickable and cleaned up the code a bit.

Here’s the modified status-press-widget.php file:

<?php
/*
Plugin Name: Status Press Widget
Plugin URI: http://www.briandgoad.com/blog/status-press-widget/
Description: Adds a Widget to display your Facebook/Twitter/Last.FM/Pownce status in your sidebar.
Version: 1.14
Author: Brian D. Goad
Author URI: http://www.briandgoad.com/blog
*/

/*
    Copyright 2008  Brian D. Goad  (email : bdgoad@gmail.com)
            & Adam Walker Cleaveland &  C. Scott Andreas,
            Authors of the original Status Press Plugin

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

if (!function_exists("htmlspecialchars_decode")) {
    function htmlspecialchars_decode($string,$style=ENT_COMPAT){
        $translation = array_flip(get_html_translation_table(HTML_SPECIALCHARS,$style));
        if ($style === ENT_QUOTES) {
            $translation['&#039;'] = '\'';
        }
        return strtr($string,$translation);
    }
}

class SPWidget {
    //Set Defaults
    var $default_options = array(
        'title' => "",
        'social' => "",
        'url' => "",
        'num' => "1",
        'status_mods' => "",
        'show_time' => 1,
        'time_mods' => ""
    );

    var $o;

    function SPWidget() {}

    //Begin By Checking to See if Widget Can Exist
    function init() {
        if (!function_exists('register_sidebar_widget')) {
            return;
        }
        if (!$options = get_option('widget_status_press')) {
            $options = array();
        }
        $widget_ops = array('classname' => 'widget_status_press', 'description' => 'Add a Social Status to your sidebar');
        $control_ops = array('width' => 200, 'height' => 350, 'id_base' => 'status_press');
        $name = 'Status Press';
        $registered = false;

        //Register Widgets
        foreach (array_keys($options) as $o) {
            if (!isset($options[$o]['title'])) {
                continue;
            }
            $id = "status_press-$o";
            $registered = true;
            wp_register_sidebar_widget($id, $name, array(&$this, 'widget'), $widget_ops, array( 'number' => $o ) );
            wp_register_widget_control($id, $name, array(&$this, 'control'), $control_ops, array( 'number' => $o ) );
        }
        if (!$registered) {
            wp_register_sidebar_widget('status_press-1', $name, array(&$this, 'widget'), $widget_ops, array( 'number' => -1 ) );
            wp_register_widget_control('status_press-1', $name, array(&$this, 'control'), $control_ops, array( 'number' => -1 ) );
        }
    }

    function widget($args, $widget_args = 1) {
        //Retrieve Any Arguments
        extract($args);

        if (is_numeric($widget_args)) {
            $widget_args = array('number' => $widget_args);
        }

        $widget_args = wp_parse_args($widget_args, array( 'number' => -1 ));
        extract($widget_args, EXTR_SKIP);

        //Get Options Saved in Control
        $options_all = get_option('widget_status_press');

        if (!isset($options_all[$number])) {
            return;
        }

        $this->o = $options_all[$number];
        //Set Temp Values (in case they have changed)
        $title = htmlspecialchars($this->o['title'], ENT_QUOTES);
        $url = $this->o['url'];
        $num = htmlspecialchars($this->o['num'], ENT_NOQUOTES);
        $status_mods = htmlspecialchars_decode($this->o['status_mods'], ENT_QUOTES);
        $show_time = $this->o['show_time'];
        $show_nick = $this->o['show_nick'];
        $time_mods = htmlspecialchars_decode($this->o['time_mods'], ENT_QUOTES);
        //Begin Status Press Functions

        require_once (ABSPATH . WPINC . '/rss.php');

        if ($url == '' ) {
            if ($title == '') {
                $title = 'Status Press';
            }
            $disp .= '<p>You Must Supply the URL to your Facebook Status RSS Feed </p>';
        } else {
            //Adjust cache setting
            if ( !defined('MAGPIE_CACHE_AGE') ) {
                define('MAGPIE_CACHE_AGE', 5*60); // five minutes
            }
            $rss = fetch_rss($url);
            if($rss) {
                if ($title == '') {
                    $title = $rss->channel[title];
                }
                if ($num > 0) {
                    $rss->items = array_slice($rss->items, 0, $num);
                }
                foreach($rss->items as $item) {
                    //Get Status Text
                    $status = $item[title];
                    if ($status != '') {
                        // Removes the nick in front of status text and makes any URL's into clickable links.
                        if (!$show_nick) {
                            $status = trim(substr($status, stripos($status, ':')+1));
                        }
                        $status = make_clickable($status);
                        $disp .= "\t<p " . $status_mods . ">" . $status;
                        if ($show_time) {
                            // Get the date + time of the last update from the RSS feed.
                            $pubdate = $item[pubdate];
                            // Convert this string to a time.
                            $pubdate = strtotime($pubdate);
                            // Calculate how long it's been since the status was updated.
                            $today = time();
                            $difference = $today - $pubdate;
                            // Display how long it's been since the last update.
                            $disp .= "</p><p ". $time_mods . ">(Updated ";
                            // Show days if it's been more than a day.
                            if (floor($difference / 86400) > 0) {
                                $disp .= floor($difference / 86400);
                                if (floor($difference / 86400) == 1) {
                                    $disp .= ' day, ';
                                } else {
                                    $disp .= ' days, ';
                                }
                                $difference -= 86400 * floor($difference / 86400);
                            }
                            // Show hours if it's been more than an hour.
                            if (floor($difference / 3600) > 0) {
                                $disp .= floor($difference / 3600);
                                if (floor($difference / 3600) == 1) {
                                    $disp .= ' hour, ';
                                } else {
                                    $disp .= ' hours, ';
                                }
                                $difference -= 3600 * floor($difference / 3600);
                            }
                            // Show minutes if it's been more than a minute.
                            $disp .= floor($difference / 60);
                            $difference -= 60 * floor($difference / 60);
                            if (floor($difference / 60) == 1) {
                                $disp .= ' minute, ';
                            } else {
                                $disp .= ' minutes ago)';
                            }
                        }
                        $disp .= "</p>\n";
                    }
                }
            } else {
                if ($title == '') {
                    $title = "Status Press";
                }
                $disp .= "\t<p>Status Press Error: Something bad happened! <br /> Here are the variables you entered: <ul><li> Title:".$title."</li><li>URL:".$url."</li><li>Number:".$num."</li><li>RSS: ".$rss."\t</li></ul></p>\n";
            }
        }
        //Call Widget
?>
                <?php echo $before_widget; ?>
                <?php echo $before_title . $title . $after_title; ?>

                <div>
                    <?php echo $disp; // Display Widget Content ?>
                </div>

                <?php echo $after_widget; ?>
<?php
    }
    function control($widget_args = 1) {
        global $wp_registered_widgets;
        static $updated = false;
        if (is_numeric($widget_args)) {
            $widget_args = array('number' => $widget_args);
        }
        $widget_args = wp_parse_args($widget_args, array('number' => -1));
        extract($widget_args, EXTR_SKIP);
        $options_all = get_option('widget_status_press');
        if (!is_array($options_all)) {
            $options_all = array();
        }
        if (!$updated && !empty($_POST['sidebar'])) {
            $sidebar = (string)$_POST['sidebar'];
            $sidebars_widgets = wp_get_sidebars_widgets();
            if (isset($sidebars_widgets[$sidebar])) {
                $this_sidebar =& $sidebars_widgets[$sidebar];
            } else {
                $this_sidebar = array();
            }
            foreach ($this_sidebar as $_widget_id) {
                if ('widget_status_press' == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number'])) {
                    $widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
                    if (!in_array("status_press-$widget_number", $_POST['widget-id'])) {
                        unset($options_all[$widget_number]);
                    }
                }
            }
            foreach ((array)$_POST['status_press'] as $widget_number => $posted) {
                if (!isset($posted['title']) && isset($options_all[$widget_number])) {
                    continue;
                }
                $options = array();
                $options['title'] = strip_tags(stripslashes($posted['title']));
                $options['social'] = $posted['social'];
                $options['url'] = sanitize_url(strip_tags($posted['url']));
                $options['show_nick'] = $posted['show_nick'];
                $options['num'] = intval($posted['num']);
                $options['status_mods'] = strip_tags(stripslashes($posted['status_mods']));
                $options['show_time'] = isset($posted['show_time']);
                $options['time_mods'] = strip_tags(stripslashes($posted['time_mods']));
                $options_all[$widget_number] = $options;
            }
            update_option('widget_status_press', $options_all);
            $updated = true;
        }
        if (-1 == $number) {
            $wpnm = '%i%';
            $values = $this->default_options;
        } else {
            update_option('widget_status_press', $options_all);
            $wpnm = $number;
            $values = $options_all[$number];
        }

        //Show Admin Screen
?>
        <p style="text-align:left;">
            <label for="status_press-title"><?php _e('Title (Leave Blank to Pull Title From Feed):', 'status-press-widget'); ?></label><br />
            <input style="width: 200px;" id="status_press-title" name="status_press[<?php echo $wpnm; ?>][title]" type="text" value="<?php echo htmlspecialchars($values['title'], ENT_QUOTES); ?>" />
        </p>
        <script language="javascript">
            function rss(social) {
                actSocial = social.value;
                var txtUrl = document.getElementById("status_press-url[<?php echo $wpnm; ?>]")
                function getUserName(actSocial) {
                    do {
                        var name = prompt("Please input your " + actSocial + " username here:", "");
                    } while (name == "");
                    if (name!=null && name!="") {
                        return name;
                    } else {
                        social.selectedIndex = 0;
                    }
                }
                switch (actSocial) {
                    case "Facebook":
                        okFB = confirm('Please ensure that you are already logged in to Facebook.');
                        if (okFB) {
                            alert('On the following page, please find the My Status RSS feed and copy it into the box below.');
                            window.open("http://www.facebook.com/minifeed.php?filter=11");
                        }
                    break;
                    case "Twitter":
                        name = getUserName(actSocial);
                        if (name != null) {
                            txtUrl.value = "http://twitter.com/statuses/user_timeline/" + name + ".rss";
                        }
                    break;
                    case "Last.FM":
                        name = getUserName(actSocial);
                        if (name != null) {
                            txtUrl.value = "http://ws.audioscrobbler.com/1.0/user/" + name + "/recenttracks.rss";
                        }
                    break;
                }
            }
            function showHide(that, element) {
                e = document.getElementById(element);
                if (that.checked) {
                    e.style.visibility = "visible";
                } else {
                    e.style.visibility = "hidden";
                }
            }
            //showHide(document.getElementById("status_press-show_time[<? echo $wpnm; ?>]"), "status_press-time_mods[<? echo $wpnm; ?>]");
        </script>

        <p style="text-align:left;">
            <span style="vertical-align: bottom;"><?php _e('Social Status Network:  ', 'status-press-widget'); ?></span>
            <select name="status_press[<?php echo $wpnm; ?>][social]" id="status_press-social" onchange="rss(this)">
                <option value=""<?php if($values['social'] == '') echo ' selected="selected"'; ?>></option>
                <option value="Facebook"<?php if($values['social'] == "Facebook") echo ' selected="selected"'; ?>><?php _e('Facebook', 'status-press-widget'); ?></option>
                <option value="Twitter"<?php if($values['social'] == "Twitter") echo ' selected="selected"'; ?>><?php _e('Twitter', 'status-press-widget'); ?></option>
                <option value="Last.FM"<?php if($values['social'] == "Last.FM") echo ' selected="selected"'; ?>><?php _e('Last.FM', 'status-press-widget'); ?></option>
            </select>
        </p>
        <p>
            <label for="status_press-url[<?php echo $wpnm; ?>]"><?php _e('Status URL Feed:', 'status-press-widget'); ?></label><br />
            <input style="width: 230px;" id="status_press-url[<?php echo $wpnm; ?>]" name="status_press[<?php echo $wpnm; ?>][url]" type="text" value="<?php echo $values['url']; ?>" />
        </p>
        <p><?php if($values['show_nick']) $values['show_nick'] = ' checked="checked"';?>
            <label for="status_press-show_nick"><?php _e( 'Show nick-/username: ', 'status-press-widget'); ?></label>
            <input type="checkbox" class="checkbox" id="status_press-show_nick[<?php echo $wpnm; ?>]" name="status_press[<?php echo $wpnm; ?>][show_nick]"<?php echo $values['show_nick']; ?> />
        </p>
        <p style="text-align:left;">
            <label for="status_press-num"><?php _e('Number of Status Feeds to Display <br/>(Use "0" to display All):', 'status-press-widget'); ?></label><br />
            <input style="width: 20px;" id="status_press-num" name="status_press[<?php echo $wpnm; ?>][num]" type="text" value="<?php echo htmlspecialchars($values['num'], ENT_NOQUOTES); ?>" />
        </p>
        <p style="text-align:left;">
            <label for="status_press-status_mods"><?php _e('Stylizing Modifications for Status Tags<br/>(i.e. id="status_press", etc):', 'status-press-widget'); ?></label><br />
            <input style="width: 230px;" id="status_press-status_mods" name="status_press[<?php echo $wpnm; ?>][status_mods]" type="text" value="<?php echo htmlspecialchars($values['status_mods'], ENT_QUOTES); ?>" />
        </p>
        <p><?php if($values['show_time']) $values['show_time'] = ' checked="checked"'; ?>
            <label for="status_press-show_time"><?php _e( 'Show Time Since Status Update: ', 'status-press-widget'); ?></label>
            <input type="checkbox" class="checkbox" id="status_press-show_time[<?php echo $wpnm; ?>]" name="status_press[<?php echo $wpnm; ?>][show_time]" onClick="showHide(this, \'status_press-time_mods[<?php echo $wpnm; ?>]\')"<?php echo $values['show_time']; ?> />
        </p>
        <p style="text-align:left;" id="status_press-time_mods[<?php echo $wpnm; ?>]">
            <label for="status_press-time_mods[<?php echo $wpnm; ?>]"><?php _e('Stylizing Modifications for Time Since Tags <br/>(i.e. id="status-time", etc):', 'status-press-widget'); ?></label><br />
            <input style="width: 230px;" id="status_press-time_mods[<?php echo $wpnm; ?>]" name="status_press[<?php echo $wpnm; ?>][time_mods]" type="text" value="<?php echo htmlspecialchars($values['time_mods'], ENT_QUOTES); ?>" />
        </p>
        <input type="hidden" id="status_press-submit" name="status_press[<?php echo $wpnm; ?>][submit]" value="1" />
<?php
    }
}
$spw = new SPWidget();
//Initialize Widget on Run
add_action('widgets_init', array($spw, 'init'));

?>
Categories: Blog, PHP Tags: , ,

MySQL connections failures and timeouts, part 2

December 12th, 2009 Brian Schmidt Pedersen 2 comments

Seems like Surftown got the problems fixed without moving my database to another server.

Categories: Blog Tags: , ,

MySQL connections failures and timeouts

December 3rd, 2009 Brian Schmidt Pedersen No comments

So there seems to be some problems with the MySQL database server at Surftown where my sites are hosted. Surftown have informed me that they will move my database to another server, so there will be some downtime while pointers are updated across the DNS servers, when they have moved it.

Categories: Blog Tags: , ,

New theme

December 2nd, 2009 Brian Schmidt Pedersen No comments

Playing around with a new theme, so several items will probably be missing or otherwise not working, until I have fixed it.

Categories: Blog Tags:

Ubuntu and making Windows default boot

December 2nd, 2009 Brian Schmidt Pedersen No comments

I recently installed Ubuntu on my Dell Studio 17, dualbooting Windows 7 and I wanted to make windows 7 the default boot. I did this by changing the “default=0″ setting in “/etc/default/grub” to “default=4″, then running “update-grub”. This basically tells GRUB to use menu-entry number 5 (0, 1, 2, 3, 4) as the default boot option. Since Ubuntu by default have 2 Linux kernels (regular and recovery) as well as 2 Memtest, this would select Windows 7.

A little while later I upgraded several applications in Ubuntu as well as the kernel. Updating the kernel added 2 extra menu-entries to GRUB, which t hen meant that menu-entry 5 (“default=4″) would be one of the 2 Memtest entries. This would mean I actually had to update GRUB manually every time I upgraded kernels? Nah, I didn’t want that. The way I did this was rather simple.

First I ensured that the “default” setting in “/etc/grub/default” were set to “0″ (“default=0″) which is first menu-entry. Second I renamed “/etc/grub.d/30_os-loader” to “/etc/grub.d/09_os-loader”. If you notice there are several numbered files in “/etc/grub.d”. These determines the order of selection (or rather order of compilation) when running the “update-grub” command. By putting the “os-loader” entry below the “linux” entry it puts Windows 7 before the Linux entries in the GRUB menu.

Categories: Blog Tags: , , ,

Google Apps e-mail with Google Toolbar

December 12th, 2007 Brian Schmidt Pedersen 17 comments

So I’ve more or less switched to using only Google Apps‘ Webmail (Gmail with your own domain), making Thunderbird obsolete. To that end I’ve been trying to find a way to make mailto links launch my Google Apps composer window rather than the default Gmail composer window, and also how to make Gmail start by default in https (secure) mode rather than http (plain) mode.

In my search I’ve stumbled upon several resources, most pointing to using GreaseMonkey and a small script that re-writes all mailto links, another resource pointing to Gmail Manager saying it could handle Google Hosted Accounts (aka. Google Apps accounts), as well as some sites that explains how you fix the Gmail button for Google Toolbar to launch Gmail as https by default.

Of the resources pointed out in regards to the mailto handling, I found several GreaseMonkey scripts that did this job very well, although I didn’t really relish the idea of having that addon installed merely because I needed 1 script to handle mailto links, so I decided to try Gmail Manager instead

Gmail Manager was very easy to set up to handle Google Apps accounts in regards to checking e-mails, opening inbox and a few other minor things. All I had to do was type in my e-mail address and my password. Gmail Manager also handles mailto links, at least it opens my inbox when clicking a mailto link, but that isn’t enough for me, I want it to open the actual compose window. I decided it probably just was some hidden configuration option so I decided to muck around a bit in about:config, and behold: There I found “google.toolbar.mailto.providers.Gmail”, which contained the URL that Google Toolbar uses to open the composer window, when clicking mailto links.

So basically, all I had to do from the start was this:

Edit the Gmail button to open the Google Apps account instead of the Gmail account, and in https rather than http

  1. Go into Google Toolbar Options, under the Buttons tab
  2. Mark the Gmail button and click “Edit…”
  3. In the dialog that opens up click the “Use the advanced editor…” link
  4. There are 3 places that needs to be fixed:
    Change:

    http://mail.google.com/mail/?search=query&view=tl&start=0&init=1&fs=1&q={query}&source=navclient

    To:

    https://mail.google.com/a/MYDOMAIN.TLD?search=query&view=tl&start=0&init=1&fs=1&q={query}&source=navclient

    Change:

    http://mail.google.com/?source=navclient

    To:

    https://mail.google.com/a/MYDOMAIN.TLD?source=navclient

    Change:

    http://mail.google.com/mail?atom_browser_auth&source=navclient

    To:

    https://mail.google.com/a/MYDOMAIN.TLD?atom_browser_auth&source=navclient

    (Note: Replace MYDOMAIN.TLD with your own domain)

  5. Click “Save to Google Toolbar…”
  6. When/if asked to replace the Gmail button just click “Replace”.

Thanks to Stefano Savanelli for his comment referring to this following link where you can add a Google Apps e-mail button:
http://code.google.com/p/gtb-gmail-apps-button/

Now the Gmail button is fixed, now to make Google Toolbar send e-mail using the Google Apps account:

  1. Enable “Send with Gmail” in the Google Toolbar Options, under the More tab.
  2. Open about:config and locate “google.toolbar.mailto.providers.Gmail” (filtering by “gmail” makes it easier to find).
  3. Change the value
    From:

    firetool-mail:http://mail.google.com/mail/?view=cm&amp;fs=1@to=to&amp;subject=su&amp;body=body&amp;cc=cc&amp;bcc=bcc&amp;name=Gmail

    To:

    firetool-mail:https://mail.google.com/a/MYDOMAIN.TLD?view=cm&amp;fs=1&amp;tf=1@to=to&amp;subject=su&amp;body=body&amp;cc=cc&amp;bcc=bcc&amp;name=Gmail

    (Note: Replace MYDOMAIN.TLD with your own domain)

By adding the “&tf=1” variable to the URL the composer window will open “full screen”, without the folder list to the left and the search bar at the top.

There.. Now we have made Google Toolbar handle all aspects of our Google Apps account :)

Categories: Blog Tags: , , ,

Site moved, again

October 27th, 2007 Brian Schmidt Pedersen No comments

So I got tired of Servage being slow as hell so I moved back to Surftown, best host for cheap amount of cash I’ve found.

There might still be a few quirks, most likely related to permissions, that I need to find and work out. If you find any, feel free to comment on them in this post :)

Categories: Blog Tags: , ,

Star Trek: The Next Generation

September 1st, 2007 Brian Schmidt Pedersen 1 comment

I got the urge the other day to watch some Star Trek: The Next Generation series, unfortunately for me I didn’t have the series around here so I accidentally ordered the entire series. That’s 7 seasons and a total cost of 2332 SEK at www.DVD.se. Now I’m just waiting for them to arrive so I can satisfy my urges ;)