package com.xiaozhi.blog.web.others.sina;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.tianji.test.core.redis.LoginHelper;
import com.xiaozhi.blog.mongo.MongoUserDao;
import com.xiaozhi.blog.vo.SinaAccessToken;
import com.xiaozhi.blog.service.other.sina.BlogTime;
import com.xiaozhi.blog.service.other.sina.Faces;
import com.xiaozhi.blog.utils.FileUtil;
import weibo4j.Friendships;
import weibo4j.Timeline;
import weibo4j.Users;
import weibo4j.http.ImageItem;
import weibo4j.model.Paging;
import weibo4j.model.Status;
import weibo4j.model.StatusWapper;
import weibo4j.model.User;
import weibo4j.model.UserWapper;
import weibo4j.model.WeiboException;
@Controller
@RequestMapping("/blog/sina")
public class SinaBlogController {
private static Log logger = LogFactory.getLog(SinaBlogController.class);
@Autowired
private Timeline timeline;
@Autowired
private Users users;
@Autowired
private Friendships friendships;
@Autowired
private MongoUserDao mongoUserDao;
@Autowired
private BlogTime blogTime;
/**
* 获取用户首页微博列表(包括关注人的微博)
* @param page
* @param model
* @return
*/
@RequestMapping(value = "hometimeline", method = RequestMethod.GET)
public String hometimeline(@RequestParam(required = false,defaultValue="1") Integer page,
HttpServletRequest request,Model model) {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
if(accessToken==null)return "redirect:/bind/sina?callbackUrl=/blog/sina/hometimeline";
timeline.client.setToken(accessToken.getAccesstoken());
try {
StatusWapper statusWapper = timeline.getHomeTimeline(0, 0, new Paging(page, 20));
model.addAttribute("statusWapper",this.blogTime.getStatusWapperWithFaceImage(statusWapper,timeline));
model.addAttribute("pages", getPages (statusWapper.getTotalNumber(),20));
model.addAttribute("page",new Paging(page, 20));
model.addAttribute("sessionId", request.getSession().getId());
} catch (WeiboException e) {
logger.debug("--------------------------->error :"+e.getError());
if("expired_token".equals(e.getError())){
return "redirect:/bind/sina?callbackUrl=/blog/sina/hometimeline";
}else{
e.printStackTrace();
}
}
return "/blog/sina/hometimeline";
}
/**
* ajax 微博分页
* @param name
* @param page
* @param model
* @return
*/
@RequestMapping(value = "timeLinepage/page", method = RequestMethod.GET)
public String homeTimeLinePage(Integer page,Model model) {
try {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
timeline.client.setToken(accessToken.getAccesstoken());
StatusWapper statusWapper = timeline.getHomeTimeline(0, 0, new Paging(page, 20));
model.addAttribute("statusWapper",this.blogTime.getStatusWapperWithFaceImage(statusWapper,timeline));
model.addAttribute("pages", getPages (statusWapper.getTotalNumber(),20));
model.addAttribute("page",new Paging(page, 20));
} catch (WeiboException e) {
e.printStackTrace();
}
return "/blog/sina/post";
}
/**
* 图片上传
* @param model
* @param logo
* @param resquest
* @return
*/
@RequestMapping(method = RequestMethod.POST,value="upload")
public @ResponseBody String upload(ModelMap model,@RequestParam("filename") MultipartFile logo,HttpServletRequest resquest ) {
try {
byte[] a = logo.getBytes();
String filePath = resquest.getRealPath(resquest.getServletPath());
String name=FileUtil.sinaUploadFileHandle(a, filePath, LoginHelper.getUserId(), logo.getOriginalFilename());
return resquest.getServletPath()+"/"+name;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "true";
}
/**
* 提交新浪微博
* @param content
* @param pic
* @param model
* @return
* @throws IOException
*/
@RequestMapping(value = "updateStatus", method = RequestMethod.POST)
public String updateStatus(String content,String pic,HttpServletRequest resquest,Model model) throws IOException {
Status status = null;
try {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
timeline.client.setToken(accessToken.getAccesstoken());
if(pic==null || "".equals(pic)){
status = timeline.UpdateStatus(content);
}else{
String filePath = resquest.getRealPath(pic);
byte[] picbyte = FileUtil.readFileImage(filePath);
ImageItem imageItem = new ImageItem("pic", picbyte);
status = timeline.UploadStatus(java.net.URLEncoder.encode(content, "utf-8"), imageItem);
}
model.addAttribute("p",status);
return "/blog/sina/newpost";
} catch (WeiboException e) {
e.printStackTrace();
}
return null;
}
@RequestMapping(value = "showRepostForm/{id}", method = RequestMethod.GET)
public String repostFormShow(String content,@PathVariable String id,Model model) throws IOException {
Status status = null;
try {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
timeline.client.setToken(accessToken.getAccesstoken());
status = timeline.showStatus(id);
model.addAttribute("p",status);
return "/blog/sina/repostform";
} catch (WeiboException e) {
e.printStackTrace();
}
return null;
}
/**
* 转发一条微博
* @param content
* @param id
* @param model
* @return
* @throws IOException
*/
@RequestMapping(value = "repostStatus/{id}", method = RequestMethod.POST)
public String repost(String content,@PathVariable String id,Model model) throws IOException {
Status status = null;
try {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
timeline.client.setToken(accessToken.getAccesstoken());
status = timeline.Repost(id, content, 0);
model.addAttribute("p",status);
return "/blog/sina/newpost";
} catch (WeiboException e) {
e.printStackTrace();
}
return null;
}
/**
* 删除我的微博
* @param id
* @param model
* @return
*/
@RequestMapping(value = "removeBlogByMe/{id}", method = RequestMethod.POST)
public @ResponseBody boolean removeBlogByMe(@PathVariable String id,Model model){
try {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
timeline.client.setToken(accessToken.getAccesstoken());
Status status = this.timeline.Destroy(id);
return true;
} catch (WeiboException e) {
e.printStackTrace();
}
return false;
}
/**
* 获取用户微博列表
* @param page
* @param model
* @return
*/
@RequestMapping(value = "usertimeline", method = RequestMethod.GET)
public String usertimeline(@RequestParam(required = false,defaultValue="1") Integer page,Model model) {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
timeline.client.setToken(accessToken.getAccesstoken());
users.client.setToken(accessToken.getAccesstoken());
friendships.client.setToken(accessToken.getAccesstoken());
try {
StatusWapper statusWapper = timeline.getUserTimelineByUid(accessToken.getUserid(),new Paging(page, 20),0, 0);
User user = users.showUserById(accessToken.getUserid());
UserWapper followers = friendships.getFollowersById(accessToken.getUserid(), 6, 0);
UserWapper following = friendships.getFriendsBilateral(accessToken.getUserid(),0,new Paging(page, 6));
model.addAttribute("statusWapper",this.blogTime.getStatusWapperWithFaceImage(statusWapper,timeline));
model.addAttribute("user",user);
model.addAttribute("followers",followers);
model.addAttribute("following",following);
model.addAttribute("pagelist", "manage");
model.addAttribute("pages", getPages (statusWapper.getTotalNumber(),20));
model.addAttribute("page",new Paging(page, 20));
} catch (WeiboException e) {
logger.debug("--------------------------->error :"+e.getError());
if("expired_token".equals(e.getError())){
return "redirect:/bind/sina?callbackUrl=/blog/sina/hometimeline";
}else{
e.printStackTrace();
}
}
return "/blog/sina/userblogs";
}
/**
* ajax 微薄分页
* @param name
* @param page
* @param model
* @return
*/
@RequestMapping(value = "usertimeline/page", method = RequestMethod.GET)
public String usertimelinePage(Integer page,Model model) {
try {
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
StatusWapper statusWapper = timeline.getUserTimelineByUid(accessToken.getUserid(),new Paging(page, 20),0, 0);
model.addAttribute("statusWapper",this.blogTime.getStatusWapperWithFaceImage(statusWapper,timeline));
model.addAttribute("page",new Paging(page, 20));
model.addAttribute("pages", getPages (statusWapper.getTotalNumber(),20));
model.addAttribute("pagelist", "manage");
} catch (WeiboException e) {
e.printStackTrace();
}
return "/blog/sina/post";
}
/**
* 获取远程新浪表情数据
* @param model
* @return
* @throws WeiboException
*/
@RequestMapping(value = "faces", method = RequestMethod.GET)
public @ResponseBody List<Faces> getFaces(Model model) throws WeiboException{
SinaAccessToken accessToken = mongoUserDao.getAccessTokenByUser(LoginHelper.getUserId());
return this.blogTime.getRemoteExp(accessToken.getAccesstoken());
}
private long getPages (long totalNumber,long pagesize){
long pages = totalNumber % pagesize;
if (pages == 0)
pages = totalNumber / pagesize;
else
pages = totalNumber / pagesize + 1;
return pages;
}
}