Files
hpr_website/www/eps/hpr1286/make_meeting.html

250 lines
17 KiB
HTML
Raw Normal View History

2025-10-28 18:39:57 +01:00
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by perltidy on Mon Jul 1 13:37:55 2013 -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>make_meeting</title>
<style type="text/css">
<!--
/* default style sheet generated by perltidy */
body {background: #FFFFFF; color: #000000}
pre { color: #000000;
background: #FFFFFF;
font-family: courier;
}
.c { color: #228B22;} /* comment */
.cm { color: #000000;} /* comma */
.co { color: #000000;} /* colon */
.h { color: #CD5555; font-weight:bold;} /* here-doc-target */
.hh { color: #CD5555; font-style:italic;} /* here-doc-text */
.i { color: #00688B;} /* identifier */
.j { color: #CD5555; font-weight:bold;} /* label */
.k { color: #8B008B; font-weight:bold;} /* keyword */
.m { color: #FF0000; font-weight:bold;} /* subroutine */
.n { color: #B452CD;} /* numeric */
.p { color: #000000;} /* paren */
.pd { color: #228B22; font-style:italic;} /* pod-text */
.pu { color: #000000;} /* punctuation */
.q { color: #CD5555;} /* quote */
.s { color: #000000;} /* structure */
.sc { color: #000000;} /* semicolon */
.v { color: #B452CD;} /* v-string */
.w { color: #000000;} /* bareword */
-->
</style>
</head>
<body>
<a name="-top-"></a>
<h1>make_meeting</h1>
<!-- BEGIN CODE INDEX --><a name="code-index"></a>
<ul>
<li><a href="#make_date-">package main</a>
<ul>
<li><a href="#make_date-">make_date</a></li>
</ul>
</li>
<li><a href="#EOF-">EOF</a></li>
</ul>
<!-- END CODE INDEX -->
<hr />
<!-- contents of filename: make_meeting -->
<pre>
#!/usr/bin/perl
<span class="c">#===============================================================================</span>
<span class="c">#</span>
<span class="c"># FILE: make_meeting</span>
<span class="c">#</span>
<span class="c"># USAGE: ./make_meeting</span>
<span class="c">#</span>
<span class="c"># DESCRIPTION: Makes a recurrent iCalendar meeting to be loaded into</span>
<span class="c"># a calendar. This is apparently necessary when the &#39;RRULE&#39;</span>
<span class="c"># recurrence description is not adequate.</span>
<span class="c">#</span>
<span class="c"># OPTIONS: None</span>
<span class="c"># REQUIREMENTS: Needs modules Data::ICal and Date::Calc</span>
<span class="c"># BUGS: ---</span>
<span class="c"># NOTES: Distributed with the HPR episode &quot;iCalendar Hacking&quot;</span>
<span class="c"># AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com</span>
<span class="c"># LICENCE: Copyright (c) year 2012, Dave Morriss</span>
<span class="c"># VERSION: 1.0</span>
<span class="c"># CREATED: 13/10/2012 15:34:01</span>
<span class="c"># REVISION: 16/11/2012 16:04:37</span>
<span class="c">#</span>
<span class="c">#===============================================================================</span>
<span class="c"># This program is free software: you can redistribute it and/or modify it</span>
<span class="c"># under the terms of the GNU General Public License as published by the Free</span>
<span class="c"># Software Foundation, either version 3 of the License, or (at your option)</span>
<span class="c"># any later version.</span>
<span class="c"># </span>
<span class="c"># This program is distributed in the hope that it will be useful, but WITHOUT</span>
<span class="c"># ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</span>
<span class="c"># FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for</span>
<span class="c"># more details.</span>
<span class="c"># </span>
<span class="c"># You should have received a copy of the GNU General Public License along with</span>
<span class="c"># this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c">#===============================================================================</span>
<span class="k">use</span> <span class="n">5.010</span><span class="sc">;</span>
<span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
<span class="k">use</span> <span class="w">warnings</span><span class="sc">;</span>
<span class="k">use</span> <span class="w">Data::ICal</span><span class="sc">;</span>
<span class="k">use</span> <span class="w">Data::ICal::Entry::Event</span><span class="sc">;</span>
<span class="k">use</span> <span class="w">Date::Calc</span> <span class="q">qw{</span>
<span class="q">Today Day_of_Year Add_Delta_YMD Nth_Weekday_of_Month_Year</span>
<span class="q">}</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Date and time values</span>
<span class="c">#</span>
<span class="k">my</span> <span class="i">@today</span> = <span class="i">Today</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">@startdate</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">@rdate</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">$monday</span> = <span class="n">1</span><span class="sc">;</span> <span class="c"># Day of week number 1-7, Monday-Sunday</span>
<span class="k">my</span> <span class="i">@starttime</span> = <span class="s">(</span> <span class="n">19</span><span class="cm">,</span> <span class="n">00</span><span class="cm">,</span> <span class="n">00</span> <span class="s">)</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">@endtime</span> = <span class="s">(</span> <span class="n">21</span><span class="cm">,</span> <span class="n">00</span><span class="cm">,</span> <span class="n">00</span> <span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Format of an ISO UTC datetime</span>
<span class="c">#</span>
<span class="k">my</span> <span class="i">$fmt</span> = <span class="q">&quot;%02d%02d%02dT%02d%02d%02dZ&quot;</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Constants for the event</span>
<span class="c">#</span>
<span class="k">my</span> <span class="i">$calname</span> = <span class="q">&#39;Hacker Public Radio&#39;</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">$timezone</span> = <span class="q">&#39;Europe/London&#39;</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">$location</span> = <span class="q">&#39;mumble.openspeak.cc port: 64747&#39;</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">$summary</span> = <span class="q">&#39;HPR Community News&#39;</span><span class="sc">;</span>
<span class="k">my</span> <span class="i">$description</span> = <span class="h">&lt;&lt;ENDDESC</span><span class="sc">;</span>
<span class="hh">This is a test, building an iCalendar file and loading it into Thunderbird.</span>
<span class="hh">-----------------------------------------</span>
<span class="hh">Mumble settings</span>
<span class="hh">Server Name: Anything you like</span>
<span class="hh">Server Address: mumble.openspeak.cc </span>
<span class="hh">Port: 64747</span>
<span class="hh">Name: Your name or alias is fine</span>
<span class="hh">Don&#39;t have mumble, setup instructions can be found on our wiki -</span>
<span class="hh">http://linuxbasix.com/tiki-index.php?page=Linux+Basix+Mumble</span>
<span class="h">ENDDESC</span>
<span class="c">#</span>
<span class="c"># Compute the next meeting date from now</span>
<span class="c">#</span>
<span class="i">@startdate</span> = <span class="i">make_date</span><span class="s">(</span> \<span class="i">@today</span><span class="cm">,</span> <span class="i">$monday</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">-2</span> <span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Create the calendar object</span>
<span class="c">#</span>
<span class="k">my</span> <span class="i">$calendar</span> = <span class="w">Data::ICal</span><span class="w">-&gt;new</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Some calendar properties</span>
<span class="c">#</span>
<span class="i">$calendar</span><span class="i">-&gt;add_properties</span><span class="s">(</span>
<span class="q">&#39;X-WR-CALNAME&#39;</span> <span class="cm">=&gt;</span> <span class="i">$calname</span><span class="cm">,</span>
<span class="q">&#39;X-WR-TIMEZONE&#39;</span> <span class="cm">=&gt;</span> <span class="i">$timezone</span><span class="cm">,</span>
<span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Create the event object</span>
<span class="c">#</span>
<span class="k">my</span> <span class="i">$vevent</span> = <span class="w">Data::ICal::Entry::Event</span><span class="w">-&gt;new</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Add some event properties</span>
<span class="c">#</span>
<span class="i">$vevent</span><span class="i">-&gt;add_properties</span><span class="s">(</span>
<span class="w">summary</span> <span class="cm">=&gt;</span> <span class="i">$summary</span><span class="cm">,</span>
<span class="w">location</span> <span class="cm">=&gt;</span> <span class="i">$location</span><span class="cm">,</span>
<span class="w">description</span> <span class="cm">=&gt;</span> <span class="i">$description</span><span class="cm">,</span>
<span class="w">dtstart</span> <span class="cm">=&gt;</span> <span class="k">sprintf</span><span class="s">(</span> <span class="i">$fmt</span><span class="cm">,</span> <span class="i">@startdate</span><span class="cm">,</span> <span class="i">@starttime</span> <span class="s">)</span><span class="cm">,</span>
<span class="w">dtend</span> <span class="cm">=&gt;</span> <span class="k">sprintf</span><span class="s">(</span> <span class="i">$fmt</span><span class="cm">,</span> <span class="i">@startdate</span><span class="cm">,</span> <span class="i">@endtime</span> <span class="s">)</span><span class="cm">,</span>
<span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Add 12 recurring dates. (Note that this generates 12 RDATE entries rather</span>
<span class="c"># than 1 entry with multiple dates; this is because this module doesn&#39;t seem</span>
<span class="c"># to have the ability to generated the concatenated entry. The two modes of</span>
<span class="c"># expressing the repeated dates seem to be equivalent.)</span>
<span class="c">#</span>
<span class="k">for</span> <span class="k">my</span> <span class="i">$i</span> <span class="s">(</span> <span class="n">1</span> .. <span class="n">12</span> <span class="s">)</span> <span class="s">{</span>
<span class="i">@today</span> = <span class="i">Add_Delta_YMD</span><span class="s">(</span> <span class="i">@today</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">0</span> <span class="s">)</span><span class="sc">;</span>
<span class="i">@rdate</span> = <span class="i">make_date</span><span class="s">(</span> \<span class="i">@today</span><span class="cm">,</span> <span class="i">$monday</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">-2</span> <span class="s">)</span><span class="sc">;</span>
<span class="i">$vevent</span><span class="i">-&gt;add_property</span><span class="s">(</span> <span class="w">rdate</span> <span class="cm">=&gt;</span>
<span class="s">[</span> <span class="k">sprintf</span><span class="s">(</span> <span class="i">$fmt</span><span class="cm">,</span> <span class="i">@rdate</span><span class="cm">,</span> <span class="i">@starttime</span> <span class="s">)</span><span class="cm">,</span> <span class="s">{</span> <span class="w">value</span> <span class="cm">=&gt;</span> <span class="q">&#39;DATE-TIME&#39;</span> <span class="s">}</span> <span class="s">]</span><span class="cm">,</span>
<span class="s">)</span><span class="sc">;</span>
<span class="s">}</span>
<span class="c">#</span>
<span class="c"># Add the event into the calendar</span>
<span class="c">#</span>
<span class="i">$calendar</span><span class="i">-&gt;add_entry</span><span class="s">(</span><span class="i">$vevent</span><span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Print the result</span>
<span class="c">#</span>
<span class="k">print</span> <span class="i">$calendar</span><span class="i">-&gt;as_string</span><span class="sc">;</span>
<span class="k">exit</span><span class="sc">;</span>
<span class="c">#=== FUNCTION ================================================================</span>
<span class="c"># NAME: make_date</span>
<span class="c"># PURPOSE: Make the event date for recurrence</span>
<span class="c"># PARAMETERS: $refdate</span>
<span class="c"># An arrayref to the reference date array (usually</span>
<span class="c"># today&#39;s date)</span>
<span class="c"># $dow Day of week for the event date (1-7, 1=Monday)</span>
<span class="c"># $n The nth day of the week in the given month required</span>
<span class="c"># for the event date</span>
<span class="c"># $offset Number of days to offset the computed date</span>
<span class="c"># RETURNS: The resulting date as a list for Date::Calc</span>
<span class="c"># DESCRIPTION: We want to compute a simple date with an offset, such as</span>
<span class="c"># &quot;the Saturday before the first Monday of the month&quot;. We do</span>
<span class="c"># this my computing a pre-offset date (first Monday of month)</span>
<span class="c"># then apply the offset (Saturday before).</span>
<span class="c"># THROWS: No exceptions</span>
<span class="c"># COMMENTS: TODO Needs more testing to be considered truly universal</span>
<span class="c"># SEE ALSO:</span>
<span class="c">#===============================================================================</span>
<a name="make_date-"></a><span class="k">sub </span><span class="m">make_date</span> <span class="s">{</span>
<span class="k">my</span> <span class="s">(</span> <span class="i">$refdate</span><span class="cm">,</span> <span class="i">$dow</span><span class="cm">,</span> <span class="i">$n</span><span class="cm">,</span> <span class="i">$offset</span> <span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Compute the required date: the nth day of week in this year and month</span>
<span class="c">#</span>
<span class="k">my</span> <span class="i">@date</span> = <span class="i">Nth_Weekday_of_Month_Year</span><span class="s">(</span> <span class="i">@$refdate</span>[ <span class="n">0</span><span class="cm">,</span> <span class="n">1</span> ]<span class="cm">,</span> <span class="i">$dow</span><span class="cm">,</span> <span class="i">$n</span> <span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># If the computed date is before the base date advance a month</span>
<span class="c">#</span>
<span class="k">if</span> <span class="s">(</span> <span class="i">Day_of_Year</span><span class="s">(</span><span class="i">@date</span><span class="s">)</span> &lt;= <span class="i">Day_of_Year</span><span class="s">(</span><span class="i">@$refdate</span><span class="s">)</span> <span class="s">)</span> <span class="s">{</span>
<span class="c">#</span>
<span class="c"># Add a month and recompute</span>
<span class="c">#</span>
<span class="i">@date</span> = <span class="i">Add_Delta_YMD</span><span class="s">(</span> <span class="i">@date</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">0</span> <span class="s">)</span><span class="sc">;</span>
<span class="i">@date</span> = <span class="i">Nth_Weekday_of_Month_Year</span><span class="s">(</span> <span class="i">@date</span>[ <span class="n">0</span><span class="cm">,</span> <span class="n">1</span> ]<span class="cm">,</span> <span class="i">$dow</span><span class="cm">,</span> <span class="i">$n</span> <span class="s">)</span><span class="sc">;</span>
<span class="s">}</span>
<span class="c">#</span>
<span class="c"># Apply the day offset</span>
<span class="c">#</span>
<span class="i">@date</span> = <span class="i">Add_Delta_YMD</span><span class="s">(</span> <span class="i">@date</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$offset</span> <span class="s">)</span><span class="sc">;</span>
<span class="c">#</span>
<span class="c"># Return a list</span>
<span class="c">#</span>
<span class="k">return</span> <span class="s">(</span><span class="i">@date</span><span class="s">)</span><span class="sc">;</span>
<span class="s">}</span>
<span class="c"># vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker</span>
<a name="EOF-"></a></pre>
</body>
</html>