diff --git a/actions/avatarsettings.php b/actions/avatarsettings.php index 1db35237ed..19f53b8828 100644 --- a/actions/avatarsettings.php +++ b/actions/avatarsettings.php @@ -119,9 +119,8 @@ class AvatarsettingsAction extends AccountSettingsAction $this->elementStart('ul', 'form_data'); if ($original) { - $this->elementStart('li', - array('id' => 'avatar_original', - 'class' => 'avatar_view')); + $this->elementStart('li', array('id' => 'avatar_original', + 'class' => 'avatar_view')); $this->element('h2', null, _("Original")); $this->elementStart('div', array('id'=>'avatar_original_view')); $this->element('img', array('src' => $original->url, @@ -135,16 +134,16 @@ class AvatarsettingsAction extends AccountSettingsAction $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); if ($avatar) { - $this->elementStart('li', - array('id' => 'avatar_preview', - 'class' => 'avatar_view')); + $this->elementStart('li', array('id' => 'avatar_preview', + 'class' => 'avatar_view')); $this->element('h2', null, _("Preview")); $this->elementStart('div', array('id'=>'avatar_preview_view')); - $this->element('img', array('src' => $original->url,//$avatar->url, + $this->element('img', array('src' => $original->url, 'width' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE, 'alt' => $user->nickname)); $this->elementEnd('div'); + $this->elementEnd('li'); } $this->elementStart('li', array ('id' => 'settings_attach')); diff --git a/actions/facebookhome.php b/actions/facebookhome.php index b05e51b911..9510e7f087 100644 --- a/actions/facebookhome.php +++ b/actions/facebookhome.php @@ -57,29 +57,30 @@ class FacebookhomeAction extends FacebookAction $this->user = $this->flink->getUser(); // If this is the first time the user has started the app - // prompt for Facebook status update permission - if (!$this->facebook->api_client->users_hasAppPermission('status_update')) { + // prompt for Facebook status update permission + if (!$this->facebook->api_client->users_hasAppPermission('status_update')) { if ($this->facebook->api_client->data_getUserPreference( - FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') { - $this->getUpdatePermission(); - return; + FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') { + $this->getUpdatePermission(); + return; } } // Make sure the user's profile box has the lastest notice $notice = $this->user->getCurrentNotice(); - $this->updateProfileBox($notice); + if ($notice) { + $this->updateProfileBox($notice); + } - if ($this->arg('status_submit') == 'Send') { + if ($this->arg('status_submit') == 'Send') { $this->saveNewNotice(); - } + } // User is authenticated and has already been prompted once for // Facebook status update permission? Then show the main page // of the app $this->showPage(); - } else { @@ -201,13 +202,13 @@ class FacebookhomeAction extends FacebookAction $this->elementEnd('p'); $this->elementStart('form', array('method' => 'post', - 'action' => $app_url, + 'action' => "$app_url/index.php", 'id' => 'facebook-skip-permissions')); $this->elementStart('ul', array('id' => 'fb-permissions-list')); $this->elementStart('li', array('id' => 'fb-permissions-item')); $this->elementStart('fb:prompt-permission', array('perms' => 'status_update', - 'next_fbjs' => 'document.setLocation(\'' . $this->app_uri . '\')')); + 'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/index.php" . '\')')); $this->element('span', array('class' => 'facebook-button'), sprintf(_('Allow %s to update my Facebook status'), $this->app_name)); $this->elementEnd('fb:prompt-permission'); diff --git a/actions/facebooklogin.php b/actions/facebooklogin.php new file mode 100644 index 0000000000..94d494a82c --- /dev/null +++ b/actions/facebooklogin.php @@ -0,0 +1,101 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/facebookaction.php'); + +class FacebookinviteAction extends FacebookAction +{ + + function handle($args) + { + parent::handle($args); + + $this->error = $error; + + if ($this->flink) { + if (!$this->facebook->api_client->users_hasAppPermission('status_update') && + $this->facebook->api_client->data_getUserPreference( + FACEBOOK_PROMPTED_UPDATE_PREF) == 'true') { + + echo '

REDIRECT TO HOME

'; + } + } else { + $this->showPage(); + } + } + + + function showContent() + { + + // If the user has opted not to initially allow the app to have + // Facebook status update permission, store that preference. Only + // promt the user the first time she uses the app + if ($this->arg('skip')) { + $this->facebook->api_client->data_setUserPreference( + FACEBOOK_PROMPTED_UPDATE_PREF, 'true'); + } + + if ($this->flink) { + + $this->user = $this->flink->getUser(); + + // If this is the first time the user has started the app + // prompt for Facebook status update permission + if (!$this->facebook->api_client->users_hasAppPermission('status_update')) { + + if ($this->facebook->api_client->data_getUserPreference( + FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') { + $this->getUpdatePermission(); + return; + } + } + + } else { + $this->showLoginForm(); + } + + } + + function showSuccessContent() + { + + + + } + + function showFormContent() + { + + + } + + function title() + { + return sprintf(_('Login')); + } + + function redirectHome() + { + + } + +} diff --git a/actions/facebooksettings.php b/actions/facebooksettings.php index e40496c187..236460c1c9 100644 --- a/actions/facebooksettings.php +++ b/actions/facebooksettings.php @@ -132,7 +132,7 @@ class FacebooksettingsAction extends FacebookAction $this->elementStart('ul', array('id' => 'fb-permissions-list')); $this->elementStart('li', array('id' => 'fb-permissions-item')); $this->elementStart('fb:prompt-permission', array('perms' => 'status_update', - 'next_fbjs' => 'document.setLocation(\'' . "$this->app_url/settings.php" . '\')')); + 'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/settings.php" . '\')')); $this->element('span', array('class' => 'facebook-button'), sprintf(_('Allow %s to update my Facebook status'), common_config('site', 'name'))); $this->elementEnd('fb:prompt-permission'); diff --git a/doc/groups b/doc/groups new file mode 100644 index 0000000000..645390e0c8 --- /dev/null +++ b/doc/groups @@ -0,0 +1,42 @@ +Users on %%site.name%% can create *groups* that other users can join. +Groups can be a great way to share information and entertainment with +a group of people who have a common interest or background. + +You can find out about groups on the server on the +[Groups](%%action.groups%%) page. You can join a group by clicking on +the "Join" button either in the group list or on the group's home page. + +Starting a new group +-------------------- + +If you want, you can start a new group for friends and people with +common interests. Note that all groups are free for anyone to join. + +To start a new group, use the [new group](%%action.newgroup%%) tool +and fill out the form. Describe your group as best you can if you want +people to be able to find it. + +When choosing the nickname for your group, try to keep it short. The +nickname is included in every message to and from the group, so the +less chars the better. Try using acronyms for organizations, or +airport codes for places (like 'pdx' instead of 'portland'). + +Sending messages to a group +--------------------------- + +You can send a message to a group using the syntax "!groupname" +anywhere in the message. If you have more than one group named, the +notice will go to each group. Only members can send notices to a +group, and groups do not respond to direct messages (DMs). + +Receiving messages +------------------ + +New group messages will appear in your inbox, and will also come to +your phone or IM client if you've set them up to receive notices. + +Remote groups +------------- + +While it's technically possible, this version of Laconica does not +support remote group membership. diff --git a/doc/help b/doc/help index 5b60072e26..a8cfccd2b3 100644 --- a/doc/help +++ b/doc/help @@ -23,6 +23,9 @@ Here are some documents that you might find helpful in understanding * [FAQ](%%doc.faq%%) - frequently-asked questions about %%site.name%% * [Contact](%%doc.contact%%) - who to contact with questions about the service * [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%% +* [SMS](%%doc.sms%%) - tying your cellphone to %%site.name%% +* [tags](%%doc.tags%%) - different ways to use tagging +* [Groups](%%doc.groups%%) - joining together in groups * [OpenID](%%doc.openid%%) - what OpenID is and how to use it with this service * [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users * [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy diff --git a/doc/sms b/doc/sms new file mode 100644 index 0000000000..1beb49786d --- /dev/null +++ b/doc/sms @@ -0,0 +1,68 @@ +You can post messages to %%site.name%% using a many kinds of cell +phones that support SMS messaging. This site does not support SMS +directly; rather, it uses your carrier's email gateway to send and +receive messages. + +Managing your SMS settings +-------------------------- + +Use the [SMS settings](%%action.smssettings%%) page to set your SMS +preferences. You can add or change your SMS number and set the +flags for SMS updates. + +When you add or change your phone number, you'll receive a message on your +phone with a verification code. Enter it into the SMS settings page to +confirm that the owner of the phone authorizes sending it messages. + +Note that only the carriers listed in the drop down list on the form +are supported by %%site.name%%. They're the only ones we know how to +make email addresses for. + +Receiving messages +------------------ + +Once you've verified your phone number, you can enable sending +messages to your phone. If you have a lot of friends and a typical +phone, it can be hard to keep up. + +Sending messages +---------------- + +To send a message, you must send an email to the incoming email +address visible on your SMS settings page. The method for sending +email from your phone varies from carrier to carrier and from handset +to handet; if in doubt, ask your carrier. + +Keep your incoming email address a secret -- it's the only way we know +you're really you! + +Commands +-------- + +You can use the following commands with %%site.name%%. + +* on - turn on notifications +* off - turn off notifications +* help - show this help +* follow - subscribe to user +* leave - unsubscribe from user +* d - direct message to user +* get - get last notice from user +* whois - get profile info on user +* fav - add user's last notice as a 'fave' +* stats - get your stats +* stop - same as 'off' +* quit - same as 'off' +* sub - same as 'follow' +* unsub - same as 'leave' +* last - same as 'get' +* on - not yet implemented. +* off - not yet implemented. +* nudge - not yet implemented. +* invite - not yet implemented. +* track - not yet implemented. +* untrack - not yet implemented. +* track off - not yet implemented. +* untrack all - not yet implemented. +* tracks - not yet implemented. +* tracking - not yet implemented. diff --git a/doc/tags b/doc/tags new file mode 100644 index 0000000000..2ed352e701 --- /dev/null +++ b/doc/tags @@ -0,0 +1,40 @@ +%%site.name%% supports +[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you +organize your activities here. You can use tags for people and for +notices. + +Tagging a notice +---------------- + +You can tag a notice using a *hashtag*; a # character followed by +letters and numbers as well as '.', '-', and '_'. Note that accented +latin characters are not supported, and non-roman scripts are right out. + +The HTML for the notice will link to a stream of all the other notices +with that tag. This can be a great way to keep track of a conversation. + +The most popular current tags on the site can be found in the [public +tag cloud](%%action.publictagcloud%%). Their size shows their +popularity and recency. + +Tagging yourself +---------------- + +You can also add tags for yourself on your [profile +settings](%%action.profilesettings%%) page. Use single words to +describe yourself, your experiences and your interest. The tags will +become links on your profile page to a list of all the users on the +site who use that same tag. It can be a nice way to find people who +are related to you geographically or who have a common interest. + +Tagging your subscriptions +-------------------------- + +You can also tag your subscriptions, on the subscriptions page. This +makes it easy to organize your subscriptions into groups and sort +through them separately. + +You can also send a notice "to the attention of" everyone you've +marked with a particular tag (note: *not* people who've marked +themselves with that tag). "@#family hello" will send a notice to +everyone you've marked with the tag 'family'. \ No newline at end of file diff --git a/htaccess.sample b/htaccess.sample index f187395ec8..d94652bfd1 100644 --- a/htaccess.sample +++ b/htaccess.sample @@ -21,6 +21,9 @@ RewriteRule ^doc/openid$ index.php?action=doc&title=openid [L,QSA] RewriteRule ^doc/openmublog$ index.php?action=doc&title=openmublog [L,QSA] RewriteRule ^doc/privacy$ index.php?action=doc&title=privacy [L,QSA] RewriteRule ^doc/source$ index.php?action=doc&title=source [L,QSA] +RewriteRule ^doc/tags$ index.php?action=doc&title=tags [L,QSA] +RewriteRule ^doc/groups$ index.php?action=doc&title=groups [L,QSA] +RewriteRule ^doc/sms$ index.php?action=doc&title=sms [L,QSA] RewriteRule ^facebook/$ index.php?action=facebookhome [L,QSA] RewriteRule ^facebook/index.php$ index.php?action=facebookhome [L,QSA] diff --git a/lib/action.php b/lib/action.php index bf053424f1..8f02b36bf5 100644 --- a/lib/action.php +++ b/lib/action.php @@ -156,10 +156,6 @@ class Action extends HTMLOutputter // lawsuit 'type' => 'text/css', 'href' => theme_path('css/display.css', 'base') . '?version=' . LACONICA_VERSION, 'media' => 'screen, projection, tv')); - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => theme_path('css/thickbox.css', 'base') . '?version=' . LACONICA_VERSION, - 'media' => 'screen, projection, tv')); $this->element('link', array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => theme_path('css/display.css', null) . '?version=' . LACONICA_VERSION, diff --git a/lib/facebookaction.php b/lib/facebookaction.php index a20e618d3a..2dbe159708 100644 --- a/lib/facebookaction.php +++ b/lib/facebookaction.php @@ -68,6 +68,8 @@ class FacebookAction extends Action $this->fbuid = $flink->foreign_id; $this->user = $flink->getUser(); } + + $this->args = array(); } function prepare($argarray) diff --git a/lib/facebookutil.php b/lib/facebookutil.php index 81737e4d53..a2a2d7cb1b 100644 --- a/lib/facebookutil.php +++ b/lib/facebookutil.php @@ -57,7 +57,7 @@ function getFacebookBaseCSS() { # Add a timestamp to the CSS file so Facebook cache wont ignore our changes $ts = filemtime(INSTALLDIR.'/theme/base/css/facebookapp.base.css'); - $cssurl = INSTALLDIR.'/theme/base/css/facebookapp.base.css' . "?ts=$ts"; + $cssurl = theme_path('css/facebookapp.base.css', 'base') . "?ts=$ts"; return $cssurl; } diff --git a/scripts/update_facebook.php b/scripts/update_facebook.php index 1574b9e09e..d2c1c3ffb9 100755 --- a/scripts/update_facebook.php +++ b/scripts/update_facebook.php @@ -34,7 +34,7 @@ require_once INSTALLDIR . '/lib/facebookutil.php'; $last_updated_file = INSTALLDIR . '/scripts/facebook_last_updated'; // Lock file name -$tmp_file = "/tmp/update_facebook.lock"; +$tmp_file = INSTALLDIR . '/scripts/update_facebook.lock'; // Make sure only one copy of the script is running at a time if (!($tmp_file = @fopen($tmp_file, "w"))) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index b4f3ffd54a..1769dc1c13 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -226,7 +226,7 @@ position:absolute; right:0; top:49px; float:right; -width:322px; +width:300px; } #page_notice { clear:both; @@ -371,7 +371,7 @@ border-radius:7px; #content_inner { position:relative; width:100%; -float;left; +float:left; } #aside_primary { diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 2b71b07196..c68b0a3c44 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -1,8 +1,16 @@ -/* theme: identica */ +/** theme: default + * + * @package Laconica + * @author Sarven Capadisli + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + html, body, a:active { -background-color:#CEE1E9; +background-color:#97BFD1; } body { font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; @@ -18,14 +26,17 @@ display:none; input, textarea, select, option { font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; } -input, textarea, select { +input, textarea, select, +.entity_remote_subscribe { border-color:#aaa; } + input.submit, #form_notice.warning #notice_text-count, #nav_register a, -.form_settings .form_note { +.form_settings .form_note, +.entity_remote_subscribe { background-color:#A9BF4F; } @@ -34,35 +45,47 @@ input:focus, textarea:focus, select:focus, border-color:#A9BF4F; } input.submit, -#nav_register a { -color:#F5FDFD; +#nav_register a, +.entity_remote_subscribe { +color:#fff; } a, -div.notice-options input { +div.notice-options input, +.form_user_block input.submit, +.form_user_unblock input.submit, +#entity_send-a-message a, +.form_user_nudge input.submit, +#entity_nudge p { color:#002E6E; } -.notice p.entry-content a:visited { +.notice, +.profile { +border-top-color:#D1D9E4; +} +.section .notice, +.section .profile { +border-top-color:#97BFD1; +} + + +#content .notice p.entry-content a:visited { background-color:#fcfcfc; } -.notice p.entry-content .vcard a { +#content .notice p.entry-content .vcard a { background-color:#fcfffc; } -#aside_primary, -#user_subscribe a, -#TB_window input.submit, -.form_user_subscribe input.submit { -background-color:#fff; +#aside_primary { +background-color:#CEE1E9; } #notice_text-count { color:#333; } -#form_notice.warning #notice_text-count, -#user_actions a { +#form_notice.warning #notice_text-count { color:#000; } @@ -81,11 +104,11 @@ padding:2px 4px; #content, #site_nav_local_views a { -border-color:#F5FDFD; +border-color:#fff; } #content, #site_nav_local_views .current a { -background-color:#F5FDFD; +background-color:#fff; } #site_nav_local_views a { @@ -105,6 +128,20 @@ background-color:#F7E8E8; background-color:#EFF3DC; } + +#anon_notice { +background-color:#97BFD1; +color:#fff; +border-color:#fff; +} + +#showstream #anon_notice { +background-color:#A9BF4F; +} + + + + #export_data li a { background-repeat:no-repeat; background-position:0 45%; @@ -123,32 +160,41 @@ background-image:url(../../base/images/icons/icon_vcard.gif); } -/*user_actions*/ -#user_actions li { -border-top-color:#eee; -} -#user_subscribe a, -#TB_window input.submit, -.form_user_subscribe input.submit { -background-image: url(../images/icons/twotone/green/shield.gif); -background-position: 0 45%; +#entity_send-a-message a, +.form_user_nudge input.submit, +.form_user_block input.submit, +.form_user_unblock input.submit, +#entity_nudge p { +background-position: 0 40%; background-repeat: no-repeat; +background-color:transparent; } +.form_group_join input.submit, +.form_group_leave input.submit +.form_user_subscribe input.submit, .form_user_unsubscribe input.submit { -background-color:#647819; -color:#F5FDFD; +background-color:#A9BF4F; +color:#fff; } -#user_send-a-message a { -background:url(../images/icons/twotone/green/quote.gif) 0 45% no-repeat; +.form_user_unsubscribe input.submit, +.form_group_leave input.submit { +background-color:#97BFD1; } + +#entity_send-a-message a { +background-image:url(../images/icons/twotone/green/quote.gif); +} +#entity_nudge p, .form_user_nudge input.submit { -background:url(../images/icons/twotone/green/mail.gif) 0 45% no-repeat; +background-image:url(../images/icons/twotone/green/mail.gif); } -.form_user_block input.submit { -background:url(../images/icons/twotone/green/against.gif) 0 45% no-repeat; +.form_user_block input.submit, +.form_user_unblock input.submit { +background-image:url(../images/icons/twotone/green/shield.gif); } + /* NOTICES */ .notices li.over { background-color:#fcfcfc; @@ -195,9 +241,11 @@ background:transparent url(../images/icons/twotone/green/disfavourite.gif) no-re background:transparent url(../images/icons/twotone/green/trash.gif) no-repeat 0 45%; } -div.notice-options { -opacity:0.3; +.notices div.entry-content, +.notices div.notice-options { +opacity:0.4; } +.notices li.hover div.entry-content, .notices li.hover div.notice-options { opacity:1; } @@ -214,6 +262,10 @@ background-color:#fcfcfc; /*END: NOTICES */ +#groups #new_group a { +background:transparent url(../images/icons/twotone/green/news.gif) no-repeat 0 45%; +} + .pagination .nav_prev a, .pagination .nav_next a { @@ -227,19 +279,3 @@ background-position:0 45%; background-image:url(../images/icons/twotone/green/arrow-right.gif); background-position:100% 45%; } - - - -#home #intro #guide_steps li a { -border-color:#ccc; -color:#F5FDFD; -} -#home #intro #step_join-now a { -background-color:#f00; -} -#home #intro #step_start-a-group a { -background-color:#0f0; -} -#home #intro #step_create-a-community a { -background-color:#00f; -} \ No newline at end of file