Tuesday, March 17, 2009

Birthday Reminder For Gnome Panel

This program checks the file /home/rsrijith/shell/birthday_reminder.txt to find the upcoming birthdays in 20 days and writes into the file /home/rsrijith/shell/birthdays.
There is a file called /home/rsrijith/shell/birthdays1, the difference between it and birthdays file is that birthdays contains only first name of the person and birthdays1 contains the whole name.
So that's it. Now the code....
#!/bin/bash
echo "Birthday Finder ">>/home/rsrijith/logs/bday
date>>/home/rsrijith/logs/bday
tillm=$(date --date="+20 day" +"%b")
nowm=$(date +"%b")
tilld=$(date --date="+20 day" +"%2d")
nowd=$(date +"%d")
nowd=$((10#$nowd))
year=$(date +"%Y")
FileName='/home/rsrijith/shell/birthday_reminder.txt'
if [ -e /home/rsrijith/shell/birthdays ]
then
rm /home/rsrijith/shell/birthdays
fi
touch /home/rsrijith/shell/birthdays
if [ -e /home/rsrijith/shell/birthdays1 ]
then
rm /home/rsrijith/shell/birthdays1
fi
touch /home/rsrijith/shell/birthdays1
while read LINE
do
m=$(echo $LINE|cut -f2 -d',')
d=$(echo $LINE|cut -f3 -d',')
name=$(echo $LINE|cut -f1 -d',')
yob=$(echo $LINE|cut -f4 -d',')
if [ $m == $nowm ]
then
d="${d#0}";
if [ $nowd -le $d ]
then
name1=$name;
name=` echo $name|sed 's/\([^ ]*\).*/\1/;s/\([^.]*\).*/\1/'`
dif=$(($d-$nowd))
yrdif=$(($year-$yob))
if [ $dif -le 1 ]
then
if [ $dif -eq 0 ]
then
echo "Happy Birthday to "$name>>/home/rsrijith/shell/birthdays
echo "Happy Birthday to "$name1>>/home/rsrijith/shell/birthdays1
else
echo "$dif day to "$name"'s Birthday">>/home/rsrijith/shell/birthdays
echo "$dif day to "$name1"'s Birthday">>/home/rsrijith/shell/birthdays1
fi
else
echo "$dif days to "$name"'s Birthday">>/home/rsrijith/shell/birthdays
echo "$dif days to "$name1"'s Birthday">>/home/rsrijith/shell/birthdays1
fi

fi
else
if [ $m == $tillm ]
then
if [ $tilld -gt $d ]
then
name1=$name
name=` echo $name|sed 's/\([^ ]*\).*/\1/'`
lastdate=$(date -d "-$(date +%d) days +1 month"|cut -f 3 -d " ")
echo "$d $lastdate $nowd"

dif=$(($d+$lastdate-$nowd))
yrdif=$(($year-$yob))
echo "$dif days to "$name1"'s Birthday">>/home/rsrijith/shell/birthdays1
echo "$dif days to "$name"'s Birthday">>/home/rsrijith/shell/birthdays
fi
fi
fi
done < $FileName
if [ ! -s /home/rsrijith/shell/birthdays ]
then
echo "Nothing to Remind" > /home/rsrijith/shell/birthdays
fi
cat /home/rsrijith/shell/birthdays1|sort -n >/home/rsrijith/temp && mv /home/rsrijith/temp /home/rsrijith/shell/birthdays1
cat /home/rsrijith/shell/birthdays|sort -n >/home/rsrijith/temp && mv /home/rsrijith/temp /home/rsrijith/shell/birthdays

This code is part of the Perl Panel Code. The related codes to this are:

Reminder for Gnome Panel

This is the program that lets us to enter the text and time at which it should be reminded me. The command has the following options
  • -d: date eg:  17/3/2009
  • -t : time [ It's should be entered as 24hr clock] eg:   20:00:00
  • -r : reminder text [ It should be entered in between a double quotes ] eg: "This is a test"
  • -p :priority [ I hav'nt implemented it yet . Kept it for future implementation.] eg : 1
  • -b :Remind me before [ By using it we can change the default remind before time of 5mins ie it is used to remind from a specific mins before the time we have scheduled to remind. It is specified in mins] eg: 5
#!/usr/bin/perl
use Time::Local;
my @date;
my @time;
my $d=0,$t=0,$r=0,$p=0,$b=0;
my @deftime=localtime();
$deftime[5]+=1900;
$deftime[4]++;
my $dv="$deftime[3]/$deftime[4]/$deftime[5]",$tv="$deftime[2]:$deftime[1]:$deftime[0]",$rv="",$pv=1,$bv=0;
foreach $argnum (0 .. $#ARGV)
{
if($ARGV[$argnum] eq "-d")
{
$d=1;
$dv=$ARGV[$argnum+1];
}
elsif($ARGV[$argnum] eq "-t")
{
$t=1;
$tv=$ARGV[$argnum+1];
}
elsif($ARGV[$argnum] eq "-r")
{
$r=1;
$rv=$ARGV[$argnum+1];
print "Remind Text:$rv\n";
}
elsif($ARGV[$argnum] eq "-p")
{
$p=1;
$pv=$ARGV[$argnum+1];
print "Priority:$pv\n";
}
elsif($ARGV[$argnum] eq "-b")
{
$b=1;
$bv=$ARGV[$argnum+1];
print "Remind Before:$bv\n";
}
}
@date=split('/',$dv);
print "Date:$dv\n";
@time={0,0,0};
@time=split(':',$tv);
print "Time:$tv";
$date[1]--;
my $time=timelocal($time[2],$time[1],$time[0],$date[0],$date[1],$date[2],);
my $nowtime=timelocal(localtime());
my $difftime=$time-$nowtime;
print "\nTime Of Alarm:".$time."\nTime Now:".$nowtime."\nDifference in Seconds:".$difftime."\n";

open (FH,">>/home/rsrijith/perl/reminder");
print FH "$time:$pv:$bv:$rv\n";
close FH;
This code is part of the Perl Panel Code. The related codes to this are:

Backend For Panel Reminder

I had already posted about creating a Display Reminders In Gnome Panel. This post is an addition to that script. This is a backend script that writes what to print into the panel_remind file. I use this script to print Birthday Reminder and Things to remember of which I will be posting shortly.
So the Code is simple Perl script.
#!/usr/bin/perl
our $printl;our $i=0;our $r=0;
$| = 1;
while(TRUE)
{
open (RB,"/home/rsrijith/perl/reminder");
my @line=<RB>;
close RB;
if($line[0])
{
while($line[$i])
{
open (WR,">/home/rsrijith/panel_remind");
my @s=split(":",$line[$i]);
my $nowtime=timelocal(localtime());
my $a=$s[2]+300;
if(($s[0]-$nowtime<=$a)&&($s[0]-$nowtime>=0))
{
my $t= to_int((($s[0]-$nowtime)/60));
while($t>0)
{
open (WR,">/home/rsrijith/panel_remind");
print WR "Red:In $t Mins - $s[3]";
close WR;
$r=1;
$t--;
sleep(60);
if( $t == 0)
{ `notify-send "$s[3]" -u critical -t 60000`}
}
}
open (WB,">/home/rsrijith/perl/reminder");
my $nowtime=timelocal(localtime());
if($s[0]-$nowtime>0)
{
print WB "$line[$i]";
close WB;
}
$i++;

}
if($r eq 0)
{
bday();
}
$i=0;
}
else
{
print "Birthday";
bday();
}
}


sub bday
{
open (RB,"/home/rsrijith/shell/birthdays");
my @line=<RB>;
close RB;

if((!$line[0])&&($r==0))
{
print "nothing to remind";
$printl="Black:Nothing to Remind \n:(";
open (WR,">/home/rsrijith/panel_remind");
print WR $printl;
close WR;
sleep(100);
}
while($line[$i])
{
$_=$line[$i];
if(m/Happy/)
{
$printl="Blue:$line[$i]";
}
else
{
$printl="Black:$line[$i]";
}
open (WR,">/home/rsrijith/panel_remind");
print WR $printl;
close WR;
$i++;
sleep(5);
}
$i=0;
return;
}
This script reads from files
  • /home/rsrijith/shell/birthdays: The file contains birthdays of my friends that I need to be reminded of. The method to print the upcoming birthdays into this file is posted at <will be posted soon>.
  • /home/rsrijith/perl/reminder:The file contains reminders that I need to  be reminded. I used another script to write into that file which is posted at <will be posted soon >.
This program needs libnotify  package. The package name is libnotify1 in my computer. It may vary with linux you are in.



So the ordinary panel reminder can be made of some use using this script.
So try it out and tell me how it went.

Saturday, March 14, 2009

Auto Away Notifier for Pidgin in Perl

Whenever I am away from laptop my chat buddies leave me lots message and finally lots of "You there???". So I thought of making a script that would inform my buddies that I am away when someone sends me a message.
This method works with Pigin API.
I have used /proc/acpi/button/lid/C267/state file to find if the lib of the laptop is closed or not. This file may vary in your laptop. So try to find the find the file in your computer that stores the status of the lid. It should be a file in /proc/acpi/button/lid/ folder and replace the file accordingly in your computer.
The Content of /proc/acpi/button/lid/C267/state is state: open and state: closed when the lid was closed.

We save this file as /usr/lib/purple-2/autonotifier.pl and use chmod +x /usr/lib/purple-2/test.pl to give the plugin execute permission. Now restart the Pidgin if it is running or open pidgin and go to Tools->Plugins and you should see a plugin named "Auto Away Plugin". Activate it and that's it.
I have used /sys/class/leds/b43-phy0\:\:radio/brightness file to notify me if there is any messages while i was away. It uses my Wi-fi light to notify me. When there is a message then the Wi-fi light blinks. This too is computer specific so find the file that controls any of the unused leds and replace that file too.
use Purple;
%PLUGIN_INFO = (
perl_api_version => 2,
name => "Auto Away Plugin",
version => "0.1",
summary => "Auto Away Notifier",
description => "Auto Away Notifier in Perl",
author => "R.Srijith <rsrijith007\@gmail.com",
url => "http://sriunplugged.blogspot.com",
load => "plugin_load",
unload => "plugin_unload"
);
sub plugin_init {
return %PLUGIN_INFO;
}

sub im_received {

my ($account, $sender, $message, $conv, $flags) = @_;
Purple::Debug::info("autonotify", "Message recieved\n");
$conv1 = Purple::Conversation->new(1, $account, $sender);
open FILE, ">>/home/rsrijith/logs/autonotifier.txt" or die $!;
open LID, "</proc/acpi/button/lid/C267/state" or die $!;
#$message=~s/<.*>//g;
while(<LID>)
{
if($_ =~ m/closed/)
{
print FILE "$sender:$message\n";
$im = $conv1->get_im_data();
if ($im) { print "ok.\n"; } else { print "fail.\n"; }
system('(if [ ! -e /var/lock/autoremind ]; then while grep -m 1 -q closed /proc/acpi/button/lid/C267/state; do touch /var/lock/autoremind; sleep 1; echo -n 0 >/sys/class/leds/b43-phy0\:\:radio/brightness; sleep 1;echo -n 1 >/sys/class/leds/b43-phy0\:\:radio/brightness; done; if [ -e /var/lock/autoremind ]; then rm /var/lock/autoremind; fi; fi)&');
$im->send("This is an automated response system: R Srijith is not at the desk rite now.");
}
}
close FILE;
}

sub plugin_load {
$plugin = shift;
$conversation_handle = Purple::Conversations::get_handle();
Purple::Signal::connect($conversation_handle, "received-im-msg", $plugin, \&im_received, $data);
Purple::Debug::info("autonotify", "Auto Notify Loaded\n");
}

sub plugin_unload {
Purple::Debug::info("autonotify", "Auto Notify Unloaded\n");
}

So try it out and comment me on how it went.