{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FunctionalDependencies #-} module Web.VKHS.Types where import Data.List import Data.Char import Data.Text(Text) import qualified Data.Text as Text import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as ByteString import Data.Aeson (FromJSON(..), ToJSON(..), (.=), (.:)) import qualified Data.Aeson as Aeson import qualified Data.Aeson.Types as Aeson import qualified Network.Shpider.Forms as Shpider bunpack = ByteString.unpack tpack = Text.pack tunpack = Text.unpack tshow :: (Show a) => a -> Text tshow = tpack . show -- | AccessToken is a authentication data, required by all VK API -- functions. It is a tuple of access_token, user_id, expires_in fields, -- returned by login procedure. -- -- See http://vk.com/developers.php?oid=-1&p=Авторизация_клиентских_приложений -- (in Russian) for more details data AccessToken = AccessToken { at_access_token :: String , at_user_id :: String , at_expires_in :: String } deriving(Show, Eq, Ord) -- | Access rigth to request from VK. -- See API docs http://vk.com/developers.php?oid=-1&p=Права_доступа_приложений (in -- Russian) for details data AccessRight = Notify -- Пользователь разрешил отправлять ему уведомления. | Friends -- Доступ к друзьям. | Photos -- Доступ к фотографиям. | Audio -- Доступ к аудиозаписям. | Video -- Доступ к видеозаписям. | Docs -- Доступ к документам. | Notes -- Доступ заметкам пользователя. | Pages -- Доступ к wiki-страницам. | Status -- Доступ к статусу пользователя. | Offers -- Доступ к предложениям (устаревшие методы). | Questions -- Доступ к вопросам (устаревшие методы). | Wall -- Доступ к обычным и расширенным методам работы со стеной. -- Внимание, данное право доступа недоступно для сайтов (игнорируется при попытке авторизации). | Groups -- Доступ к группам пользователя. | Messages -- (для Standalone-приложений) Доступ к расширенным методам работы с сообщениями. | Notifications -- Доступ к оповещениям об ответах пользователю. | Stats -- Доступ к статистике групп и приложений пользователя, администратором которых он является. | Ads -- Доступ к расширенным методам работы с рекламным API. | Offline -- Доступ к API в любое время со стороннего сервера. deriving(Show, Eq, Ord, Enum) toUrlArg :: [AccessRight] -> String toUrlArg = intercalate "," . map (map toLower . show) allAccess :: [AccessRight] allAccess = [ -- Notify Friends , Photos , Audio , Video , Docs , Notes -- , Pages , Status , Offers , Questions , Wall , Groups , Messages , Notifications , Stats -- , Ads -- , Offline ] newtype AppID = AppID { aid_string :: String } deriving(Show, Eq, Ord) data JSON = JSON { js_aeson :: Aeson.Value } deriving(Show) data Form = Form { form_title :: String , form :: Shpider.Form } deriving(Show) data FilledForm = FilledForm { fform_title :: String , fform :: Shpider.Form } deriving(Show) data GenericOptions = GenericOptions { o_login_host :: String , o_api_host :: String , o_port :: Int , o_verbose :: Bool , o_use_https :: Bool , o_max_request_rate_per_sec :: Rational -- ^ How many requests per second is allowed , o_allow_interactive :: Bool , l_appid :: AppID , l_username :: String -- ^ Empty string means no value is given , l_password :: String -- ^ Empty string means no value is given , l_access_token :: String } deriving(Show) defaultOptions = GenericOptions { o_login_host = "oauth.vk.com" , o_api_host = "api.vk.com" , o_port = 443 , o_verbose = False , o_use_https = True , o_max_request_rate_per_sec = 3 , o_allow_interactive = True , l_appid = AppID "3128877" , l_username = "" -- ^ Empty string means no value is given , l_password = "" -- ^ Empty string means no value is given , l_access_token = "" } class ToGenericOptions s where toGenericOptions :: s -> GenericOptions data Verbosity = Normal | Trace | Debug deriving(Enum,Eq,Ord,Show) data MusicOptions = MusicOptions { m_list_music :: Bool , m_search_string :: String , m_name_format :: String , m_output_format :: String , m_out_dir :: Maybe String , m_records_id :: [String] , m_skip_existing :: Bool } deriving(Show) data UserOptions = UserOptions { u_queryString :: String } deriving(Show) data WallOptions = WallOptions { w_woid :: String } deriving(Show) data GroupOptions = GroupOptions { g_search_string :: String , g_output_format :: String } deriving(Show)